百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

python 理论-函数(三)(python函数的基本用法)

itomcoil 2025-05-08 01:52 4 浏览

-- coding: utf-8 --
@Time : 2022/8/17 15:36
@Author : siyu.yang
@desc : python 第三章
                                                         函数基础
函数概念:
   函数是组织好的,可重复使用的,用来实现单一,或相关联功能更的代码段。函数能提高应用
的模块性和diamond的重复利用率,可以被用户调用。
定义函数语法:
def function(params):  #params 参数列表
    block  # 语句块
    return expression/value
(1) 在 python 中采用 def 关键字进行函数的定义,不能指定返回值的类型
(2) 函数参数 params 可以是零个、一个或者多个,函数参数也不用指定参数类型,因为
在 python 中变量都是弱类型的,python会自动根据值来维护其类型。
(3) return 语句是可选的,它可以在函数内任何地方出现,表示函数调用执行到此结束;如果没有
return 语句,会自动返回NONE,如果有 return 语句,但是 return 后面没有接表达式或者值
的话也返回 NONE
调用函数语法:
函数名(参数表):
函数举例;
def printHello()
    print('hello')
def printNum():
    for i range(0,100):
        print(i)
        return
printHello()
printNum()
   
                            函数参数分为形参和实参
形参全称形式参数,在用def关键字定义函数时函数名后面括号里的变量称为形式参数
实参全称实际参数,在调用函数时提供的值或者变量称为实际参数
举例:
def add(a,b):   # a和b为形参,add函数实现加法功能
    return a+b
c = add(2,3)  # 2和3为实参
print(c)
备注:
    python中在定义方法之后可以机上一段字符串,对函数功能进行说明
函数:函数是组织好的,可重复使用的,永安里实现单一,或相关联共功能的代码段
def 函数名(参数列表):
    语句块
1.有参函数
def print_info():
    print('我是一个无参函数')
    print('我可以被重复调用')

2.无参函数
def print_name(name):  # name 形参
    print('我的名字叫{}'.format(name))

# 3.有返回值
def add_1(a, b):
    a + b  # 没有给return 则返回NONE

def add_2(a, b):
    return a + b  # return 返回值之后则后面的语句不执行
    print('return 后面的语句')

def add_2(a, b):
    '''
    :param a:
    :param b:
    :return: a+b
    '''
    return a + b  # return 返回值之后则后面的语句不执行
    print('return 后面的语句')

调用函数,函数名(参数列表)
print_info()
print_name('张三')  # 张三是实参
print(add_1(2,3))
print(add_2(2,3))


                             参数传递
在 python 中,类型属于对象,变量时没有类型的:
         str = "newdream"
         str = 50
在以上代码中,newdream 是 string 类型的,50 是整型,而变量 str
 是没有类型的,它仅仅是一个对象的引用(指针),可以指向各种类型对象

               可更改(mutable)与不可更改(immutable)对象
在python中,strings,tuples 和 numbers 是不可更改的对象,而list,dict,set等
是可以修改的对象。
不可变类型 : 变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int值对象10,再让a指向
它,而5被丢弃,不是改变a的值,相当于新生成了a
可变类型:变量赋值 la = [1,2,3,5] 后再赋值 la[2] = 5 则是将list la
的第三个元素值更改,本身la没有懂,只是其内部的一部分值被修改了
python 函数的参数传毒:
不可变类型:类似c++的值传递,如 整型、字符串、元组。如fun(a),传递的只是a
的值,没有影响a对象本身。比如再fun(a) 内部修改a的值,只是修改另外一个赋值的
对象,不会影响a的本身
可变类型:类似c++的引用传递,如 列表,字典,集合。如fun(la),则是将la地址传过去
修改后fun外部的la也会受影响。
举例:
不可变类型:整型,字符串,元素。如fun(num) ,传递的只是num的值,没有
影响num对象本身。如果在fun(num) 内部修改num的值,只是修改另一个复制的
 对象,不会影响 num本身。
可变类型:列表,字典,集合。如 fun(lista),则是将lista真正的传过去,修改
 后 fun 外部的lista也会受影响
1.参数不可变类型:传递的是参数的值
def add(a, b):
    return a + b

print(add(2, 3))

2.参数可变数据类型:传递的是参数的内存地址(引用传递)
def add_info(name_info):
    name_info.append('王二')
    print('函数内部:',name_info)

names =['张三','李四','王五']
add_info(names)
print('函数外部:',names)

                             python 函数参数类型
  必备参数、关键字参数、缺省参数、任意个数参数
必备参数须以正确的顺序传入函数,也叫做位置参数,即参数是通过位置进行匹配的,从
左到右,依次进行匹配,这个对参数的位置和个数都有严格的而要求。

参数类型: 必备参数、关键字参数、缺省参数、任意个数参数
1、必备参数: 参数的顺序和个数都不能改变
举例:
def print_info(name,age,home):  # 必备参数
    print('我叫{},今年{},家乡是{}'.format(name,age,home))

print_info('张三',25,'长沙')

2.关键字参数:参数类别的顺序可以改变
如果前面的某个参数使用了关键字传值,那么它后面的所有参数都必须使用
关键字参数
举例:
def print_info(name, age, home):  # 必备参数
    print('我叫{},今年{},家乡是{}'.format(name, age, home))

print_info('张三', home='长沙', age=25)  # 关键字参数

3.缺省参数:缺省参数的值没有传入就是用默认值,如果传入就使用传入的
如果前面的某个参数给了默认值,那么它后面的所有参数都要给默认值
举例:
def print_info(name, age, home='上海'):  # 必备参数
    print('我叫{},今年{},家乡是{}'.format(name, age, home))

print_info('张三', age=25)  # 关键字参数

 4.任意个数参数(收集参数,不定长参数): 表示能够接收0到任意多个参数
 '*'表示讲没有匹配的值都放到同一个元组中
‘**’ 表示讲没有匹配的值都放到dictionary中
举例:
def print_info(name, *info_tuple):  # *后面的参数是元组
    print(name)
    print(info_tuple, type(info_tuple))

print_info('张三', 25, '上海')

def print_info(name, **info_tuple):  # ** 后面的参数只能是 key = value 的格式
    print(name)
    print(info_tuple, type(info_tuple))
print_info('张三', age=25, home='上海')

def get_number():
    return 3, 4, 5  # 函数可以有多个返回类型

print(get_number(), type(get_number()))

                                      变量作用域
   在 python 程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中
进行,我们称之为命名命名空间,也被称之为作用域。python 的作用域时静态的,在
源代码中变量名被赋值的位置决定了改变量的能被访问的泛微。即python变量的作用域
由变量所在源代码的位置决定。
举例:
name = '张三'  # 全局变量,全局作用域
def info():
    # global name # 强制使用全局变量
    name = '李四'
    print(name)  # 局部变量,局部作用域

info()
print(name)

作用域是相对的,都只在局部生效,都是局部优先
a = 10  # 全局作用域

                                             作用域类型
局部作用域在函数内部定义,拥有一个局部作用域,局部变量只能在其被声明的函数
内部访问。
嵌套作用域在函数内部定义,它和局部作用域是相对的,它相对于更上层的函数而言也是属于
局部作用域。主要是为了实现 python 的闭包,而增加的实现。
全局作用域在函数外部定义,拥有全局作用域,全局变量可以在整个程序范围内访问。函数内部可以
通过 global 强制定义全局变量,当函数调用时,全局变量生效。全局作用域的作用范围仅限
单个模块文件内。
内置作用域时系统内固定模块里定义的变量。
常用的作用域时局部作用域、全局作用域。
作用域:全局作用域,局部作用域,嵌套作用域,内置作用域
变量名解析LEGB法则
搜索变量名的优先级:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
LEGB法则:当在函数中使用未去欸的功能的变量名时,Python会按照优先级依次搜索
4个作用域,一次来确定改变量名的意义。首先搜索局部作用域(L)
举例:
 LEGB 法则:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
print(__file__)  #内置作用域 B
__file__ = 10  # 全局作用域 G
def pri():
    __file__ = 20  # 嵌套作用域 E
    def pri2():
        __file__ = 30  # 局部作用域 L
        print(__file__ )
    pri2()

pri()

                       函数的嵌套分为两种情况
函数的嵌套调用:即在一个函数中调用一个函数中调用其它函数的俄顷,瑞如下:
举例1:
def print1():
    a = 20  # 局部作用域

    def print2():  # 函数嵌套函数,此时函数只能在函数内部才能调用
        a = 30  # 嵌套作用域
        print(a)
    print2()
    print(a)

print(a)
print1()

嵌套函数2
1.在函数中定义一个新的函数(只能在函数内部调用该新的函数)
def print1():
    a = 20
    def print2():
        a = 30
        print(a)
    print2()
print1()
2.在一个函数中调用另外一个函数
def pri1():
    print('我是pri1函数')

def pri2():
    pri1()


                                     函数的递归
  上一个知识点中,我们讲解了函数的嵌套,在函数嵌套调用其它函数时,有一种特殊情况,
就是直接火间接地调用了函数本身,这样的一种情况称为函数的递归调用,
举例如下:
def func():
    print('kkk')  #直接调用自己
    func()
func()

def foo():  # 简介调用自己
    print('from foo')
    bar()
def bar():
    print('from bar')
    foo()
foo()
  python 在递归中没有想别的而语言对递归进行优化,所以他的每一次调用
都会基于上一次的调用进行,并且设置了最大的递归数量防止递归外溢。

def num(n):
    if n == 1:
        return 1
    return num(n-1)+2
    print(num(5))
递推:如上例,递归每一次都是基于上一次进行下一次的指向,叫递推
回溯:则是在遇到终止条件,则从最后往

 递归:函数自己调用自己
def print_hello():
    print('我是方法hello')
    print_hello()

print_hello()  # 死循环
在python中死循环,大概循环1000次左右会自动停止
递归一般在算法中使用比较多

                                          匿名函数
用lambda关键字能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
lambda 函数能接收任何数量的参数但只能返回一个表达式的值,同时不能包含命令火多个
表达式。
匿名函数不能直接调用print,因为lambda 需要一个表达式。
lambda 函数拥有自己的名字口昂见,且不能访问自有参数列表之外或全局名字空间里的参数。
    虽然 lambda 函数看起来只能写一行,却不等同于C或C++ 的内联函数,后者的目的是
调用小函数时不占用栈内存而增加运行效率
语法:
lambda 函数的语法只包含一个语句,如下:
lambda [arg1,[,arg2,...argn]]: expression
举例1:
sum = lambda arg1,arg2:arg1+arg2
print("Value of total:",sum(10,20))
举例2:
sum = lambda  a,b : a+b
print(sum(2,3))


                                                  内置函数
    python 内置函数就是python标准库里(语言自身携带的)函数(公共函数),一般各种编程语言
都会预先定义常用内置函数。因为内置函数使用频率比较频繁,所以通过内置函数的形式提供出来。
    python 内置函数大致包含如下类型:
    数学运算、类型转换、序列操作、对象操作、反射操作
    变量操作、交互操作、文件操作、编译执行、装饰器
比如:
类型转换:int(),float(),str()
序列操作:sorted(),reversed(),next()
交互操作:print(),input() 等

内置变量:系统自带的变量,都是以__开头
print(vars())   # 查看内置变量
print(__file__)  # 查看文件路径
print(__name__)  #

相关推荐

Excel新函数TEXTSPLIT太强大了,轻松搞定数据拆分!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!最近我把WPS软件升级到了版本号:12.1.0.15990的最新版本,最版本已经支持文本拆分函数TEXTSPLIT了,并...

Excel超强数据拆分函数TEXTSPLIT,从入门到精通!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!今天跟大家分享的是Excel超强数据拆分函数TEXTSPLIT,带你从入门到精通!TEXTSPLIT函数真是太强大了,轻松...

看完就会用的C++17特性总结(c++11常用新特性)

作者:taoklin,腾讯WXG后台开发一、简单特性1.namespace嵌套C++17使我们可以更加简洁使用命名空间:2.std::variant升级版的C语言Union在C++17之前,通...

plsql字符串分割浅谈(plsql字符集设置)

工作之中遇到的小问题,在此抛出问题,并给出解决方法。一方面是为了给自己留下深刻印象,另一方面给遇到相似问题的同学一个解决思路。如若其中有写的不好或者不对的地方也请不加不吝赐教,集思广益,共同进步。遇到...

javascript如何分割字符串(javascript切割字符串)

javascript如何分割字符串在JavaScript中,您可以使用字符串的`split()`方法来将一个字符串分割成一个数组。`split()`方法接收一个参数,这个参数指定了分割字符串的方式。如...

TextSplit函数的使用方法(入门+进阶+高级共八种用法10个公式)

在Excel和WPS新增的几十个函数中,如果按实用性+功能性排名,textsplit排第二,无函数敢排第一。因为它不仅使用简单,而且解决了以前用超复杂公式才能搞定的难题。今天小编用10个公式,让你彻底...

Python字符串split()方法使用技巧

在Python中,字符串操作可谓是基础且关键的技能,而今天咱们要重点攻克的“堡垒”——split()方法,它能将看似浑然一体的字符串,按照我们的需求进行拆分,极大地便利了数据处理与文本解析工作。基本语...

go语言中字符串常用的系统函数(golang 字符串)

最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...

无规律文本拆分,这些函数你得会(没有分隔符没规律数据拆分)

今天文章来源于表格学员训练营群内答疑,混合文本拆分。其实拆分不难,只要规则明确就好办。就怕规则不清晰,或者规则太多。那真是,Oh,mygod.如上图所示进行拆分,文字表达实在是有点难,所以小熊变身灵...

Python之文本解析:字符串格式化的逆操作?

引言前面的文章中,提到了关于Python中字符串中的相关操作,更多地涉及到了字符串的格式化,有些地方也称为字符串插值操作,本质上,就是把多个字符串拼接在一起,以固定的格式呈现。关于字符串的操作,其实还...

忘记【分列】吧,TEXTSPLIT拆分文本好用100倍

函数TEXTSPLIT的作用是:按分隔符将字符串拆分为行或列。仅ExcelM365版本可用。基本应用将A2单元格内容按逗号拆分。=TEXTSPLIT(A2,",")第二参数设置为逗号...

Excel365版本新函数TEXTSPLIT,专攻文本拆分

Excel中字符串的处理,拆分和合并是比较常见的需求。合并,当前最好用的函数非TEXTJOIN不可。拆分,Office365于2022年3月更新了一个专业函数:TEXTSPLIT语法参数:【...

站长在线Python精讲使用正则表达式的split()方法分割字符串详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用正则表达式的split()方法分割字符串详解》。使用正则表达式分割字符串在Python中使用正则表达式的split(...

Java中字符串分割的方法(java字符串切割方法)

技术背景在Java编程中,经常需要对字符串进行分割操作,例如将一个包含多个信息的字符串按照特定的分隔符拆分成多个子字符串。常见的应用场景包括解析CSV文件、处理网络请求参数等。实现步骤1.使用Str...

因为一个函数strtok踩坑,我被老工程师无情嘲笑了

在用C/C++实现字符串切割中,strtok函数经常用到,其主要作用是按照给定的字符集分隔字符串,并返回各子字符串。但是实际上,可不止有strtok(),还有strtok、strtok_s、strto...