参数传递
1、可更改与不可更改对象传递
传递不可变对象:strings, tuples, 和 numbers 是不可更改的对象
# 传不可变对象实例
print("# 传不可变对象实例")
def returnStr(a):
a="212"
return
b=123
print("调用函数之前取值:",b)
returnStr(b)
print("调用函数之后取值:",b)
print()
# 传不可变对象实例
调用函数之前取值: 123
调用函数之后取值: 123
传递可变对象: list,dict 等则是可以修改的对象
# 传可变对象实例
print("# 传可变对象实例")
def changelist(list1):
list1.append([1,2,3])
print("函数内部调用列表取值:",list1)
return
list2=[8,7,6]
print("调用函数之前取值:",list2)
changelist(list2)
print("函数外部调用列表取值:",list2)
# 传可变对象实例
调用函数之前取值: [8, 7, 6]
函数内部调用列表取值: [8, 7, 6, [1, 2, 3]]
函数外部调用列表取值: [8, 7, 6, [1, 2, 3]]
2、函数调用时,参数顺序可以不一致
当非函数顺序传递时,需指定函数中传递的参数名
# 函数参数传递时顺序可以不重要
def printName(firstName,lastName):
print("姓氏:",firstName)
print("名称:",lastName)
print()
return
print("按照函数参数顺序传递:姓zhang,名san")
printName("zhang","san")
print("按照函数参数非顺序传递:名san,姓zhang")
printName(lastName="san",firstName="zhang")
按照函数参数顺序传递:姓zhang,名san
姓氏: zhang
名称: san
按照函数参数非顺序传递:名san,姓zhang
姓氏: zhang
名称: san
3、不定长参数
加了星号(*)的变量名会存放所有未命名的变量参数
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
实例如下:
def printName(firstName,lastName,*infoP):
print("姓氏:",firstName)
print("名称:",lastName)
for idx in infoP:
print("其他信息",idx)
print()
return
printName("li","si")
printName("zhang","san","50kg","180cm")
姓氏: li
名称: si
姓氏: zhang
名称: san
其他信息 50kg
其他信息 180cm
匿名函数
python 使用 lambda 来创建匿名函数。
- lambda只是一个表达式,函数体比def简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
# 匿名函数
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print("相加后的值为 : ", sum(23, 27))
print("相加后的值为 : ", sum(45, 6))
相加后的值为 : 50
相加后的值为 : 51
变量的作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
- 全局变量
- 局部变量
total = 0 # 全局变量
print("total初始化:",total)
def sum(arg1, arg2):
total = arg1 + arg2 # 局部变量,相当于重新申明了一个新变量total
print("函数内是局部变量 total: ", total) #局部变量
return total
sum(4, 7)
print("函数外是全局变量 total: ", total) #全局变量,total赋值0后未重新赋值
total初始化: 0
函数内是局部变量 total: 11
函数外是全局变量 total: 0
如果在函数内要对全局变量赋值,则需要用到global进行指定
total = 0 # 全局变量
print("total初始化:",total)
def sum(arg1, arg2):
global total # 指定了total为全局变量
total= arg1 + arg2 # 在global指定全局变量后,此处不在是局部变量
print("函数内是局部变量 total: ", total) # 不再是局部变量
return total
sum(4, 7)
print("函数外是全局变量 total: ", total) #全局变量,total赋值0后在函数内重新赋值
total初始化: 0
函数内是局部变量 total: 11
函数外是全局变量 total: 11