函数传递参数的方式

Python 中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:

值传递:适用于实参类型为不可变类型(字符串、数字、元组);

引用(地址)传递:适用于实参类型为可变类型(列表,字典),
函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;

函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。
例如,定义一个名为 demo 的函数,分别为传入一个字符串类型的变量(代表值传递)和列表类型的变量(代表引用传递):

1
2
3
4
5
6
7
8
9
def nihao(str):
str +=str
print(str)
str1 = "213"
nihao(str1)
print('值传递:%s' %str1)
list = [1,2,3]
nihao(list)
print('引用传递:%s' %list)
函数关键字参数及用法

关键字参数是指使用形式参数的名字来确定输入的参数值。
通过此方式指定函数实参时,不再需要与形参的位置完全一致,只要将参数名写正确即可

可以看到,在调用有参函数时,既可以根据位置参数来调用,也可以使用关键字参数(程序中第 8 行)来调用。在使用关键字参数调用时,可以任意调换参数传参的位置。
当然,还可以像第 7 行代码这样,使用位置参数和关键字参数混合传参的方式。但需要注意,混合传参时关键字参数必须位于所有的位置参数之后

1
2
3
4
5
6
7
8
def dis_str(str1,str2):
print("str1:",str1)
print("str2:",str2)
#位置参数
dis_str("http://c.biancheng.net/python/","http://c.biancheng.net/shell/")
#关键字参数
dis_str("http://c.biancheng.net/python/",str2="http://c.biancheng.net/shell/")
dis_str(str2="http://c.biancheng.net/python/",str1="http://c.biancheng.net/shell/")
函数默认参数设置

Python 定义带有默认值参数的函数,
语法格式:
def 函数名(…,形参名,形参名=默认值):
代码块

**注意**:在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。

当然在调用 dis_str() 函数时,也可以给所有的参数传值,这时即便 str2 有默认值,它也会优先使用传递给它的新值。

1
2
3
4
5
6
#str1没有默认参数,str2有默认参数
def dis_str(str1,str2 = "http://c.biancheng.net/python/"):
print("str1:",str1)
print("str2:",str2)
dis_str("http://c.biancheng.net/shell/")
dis_str("http://c.biancheng.net/java/","http://c.biancheng.net/golang/")

但如果使用 Python 提供的内置函数,又或者其它第三方提供的函数,怎么知道哪些参数有默认值呢?
可以使用
“函数名.__defaults__”查看函数的默认值参数的当前值,其返回值是一个元组。以dis_str() 函数为例,在其基础上,执行如下代码:

1
print(dis_str.__defaults__)
函数返回多个值的方法

实际上 Python 也是如此,只不过 Python 函数能以返回列表或者元组的方式,将要返回的多个值保存到序列中,从而间接实现返回多个值的目的。
因此,实现 Python 函数返回多个值,有以下 2 种方式:

在函数中,提前将要返回的多个值存储到一个列表或元组中,然后函数返回该列表或元组;

函数直接返回多个值,之间用逗号( , )分隔,Python 会自动将多个值封装到一个元组中,其返回值仍是一个元组。

1
2
3
4
5
def nihao(str):
a = 1
b =2
return a,b,str
print(nihao (3))
将局部变量变成全局变量

在函数体内定义全局变量。使用 global 关键字对变量进行修饰后,该变量就会变为全局变量

1
2
3
4
5
6
def text():
global add
add= "http://c.biancheng.net/java/"
print("函数体内访问:",add)
text()
print('函数体外访问:',add)
获取指定作用域范围中的变量

在一些特定场景中,我们可能需要获取某个作用域内(全局范围内或者局部范围内)所有的变量,Python 提供了以下 3 种方式:

  1. globals()函数
    globals() 函数为 Python 的内置函数,它可以返回一个包含全局范围内所有变量的字典,该字典中的每个键值对,键为变量名,值为该变量的值。

    1
    2
    3
    4
    5
    #全局变量
    Pyname = "Python教程"
    def text():#局部变量
    Shename = "shell教程"
    print(globals())
  2. 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
2
3
def name(list):
return 表达式
name(list)
1
2
add = lambda x,y:x+y
print(add(3,4))