python基础知识六
函数传递参数的方式
Python 中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:
值传递:适用于实参类型为不可变类型(字符串、数字、元组);
引用(地址)传递:适用于实参类型为可变类型(列表,字典),
函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;
函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。
例如,定义一个名为 demo 的函数,分别为传入一个字符串类型的变量(代表值传递)和列表类型的变量(代表引用传递):
1 | def nihao(str): |
函数关键字参数及用法
关键字参数是指使用形式参数的名字来确定输入的参数值。
通过此方式指定函数实参时,不再需要与形参的位置完全一致,只要将参数名写正确即可
可以看到,在调用有参函数时,既可以根据位置参数来调用,也可以使用关键字参数(程序中第 8 行)来调用。在使用关键字参数调用时,可以任意调换参数传参的位置。
当然,还可以像第 7 行代码这样,使用位置参数和关键字参数混合传参的方式。但需要注意,混合传参时关键字参数必须位于所有的位置参数之后
1 | def dis_str(str1,str2): |
函数默认参数设置
Python 定义带有默认值参数的函数,
语法格式:
def 函数名(…,形参名,形参名=默认值):
代码块
**注意**:在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。
当然在调用 dis_str() 函数时,也可以给所有的参数传值,这时即便 str2 有默认值,它也会优先使用传递给它的新值。
1 | #str1没有默认参数,str2有默认参数 |
但如果使用 Python 提供的内置函数,又或者其它第三方提供的函数,怎么知道哪些参数有默认值呢?
可以使用
“函数名.__defaults__”查看函数的默认值参数的当前值,其返回值是一个元组。以dis_str() 函数为例,在其基础上,执行如下代码:
1 | print(dis_str.__defaults__) |
函数返回多个值的方法
实际上 Python 也是如此,只不过 Python 函数能以返回列表或者元组的方式,将要返回的多个值保存到序列中,从而间接实现返回多个值的目的。
因此,实现 Python 函数返回多个值,有以下 2 种方式:
在函数中,提前将要返回的多个值存储到一个列表或元组中,然后函数返回该列表或元组;
函数直接返回多个值,之间用逗号( , )分隔,Python 会自动将多个值封装到一个元组中,其返回值仍是一个元组。
1 | def nihao(str): |
将局部变量变成全局变量
在函数体内定义全局变量。使用 global 关键字对变量进行修饰后,该变量就会变为全局变量
1 | def text(): |
获取指定作用域范围中的变量
在一些特定场景中,我们可能需要获取某个作用域内(全局范围内或者局部范围内)所有的变量,Python 提供了以下 3 种方式:
globals()函数
globals() 函数为 Python 的内置函数,它可以返回一个包含全局范围内所有变量的字典,该字典中的每个键值对,键为变量名,值为该变量的值。1
2
3
4
5#全局变量
Pyname = "Python教程"
def text():#局部变量
Shename = "shell教程"
print(globals())locals()函数
locals() 函数也是 Python 内置函数之一,通过调用该函数,我们可以得到一个包含当前作用域内所有变量的字典。
这里所谓的“当前作用域”指的是,在函数内部调用 locals() 函数,会获得包含所有局部变量的字典;而在全局范文内调用 locals() 函数,其功能和 globals() 函数相同。1
2
3
4
5
6
7
8
9
10#全局变量
Pyname = "Python教程"
def text():#局部变量
Shename = "shell教程"
print("函数内部的 locals:")
print(locals())
text()
print("函数外部的 locals:")
print(locals())注意,当使用 locals() 函数获得所有局部变量组成的字典时,可以向 globals() 函数那样,通过指定键访问对应的变量值,但无法对变量值做修改
局部变量和全局变量同名
当函数内部的局部变量和函数外部的全局变量同名时,在函数内部,局部变量会“遮蔽”同名的全局变量。
lambda表达式(匿名函数)及用法
lambda 表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。
语法格式:name = lambda [list] : 表达式
其中,定义 lambda 表达式,必须使用 lambda 关键字;[list] 作为可选参数,等同于定义函数是指定的参数列表;value 为该表达式的名称。
该语法格式转换成普通函数的形式:
1 | def name(list): |
1 | add = lambda x,y:x+y |