Python教程:函数的易错点总结

可更改(mutable)与不可更改(immutable)对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  • 不可变类型:变量赋值a=5 后再赋值a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。

  • 可变类型:变量赋值la=[1,2,3,4] 后再赋值 la[2]=5。则是将list la的第三个元素值更改,la本身没有动,只是其内部的一部分值被修改了。

对于上述两种类型,函数的参数传递也是不同的:

  • 不可变类型:类似c++ 的值传递,如整数、字符串、元组。如fun(a),传递的只是a的值,或者说是a的复制品,没有影响a对象本身。比如在fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

  • 可变类型:类似c++的引用传递,如列表,字典。如fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

python中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

默认参数必须放在参数列表的最后面

def printinfo( age=35,name): # 默认参数不在最后,会报错

不定长参数

传递不定长参数有两种方法:

  • *以元组的方式传入;
  • **以字典的方式传入。

以元组的方式传入

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def  printinfo(  arg1, *vartuple  ): 
	"打印任何传入的参数"  
	print  ("输出: ")  
	print  (arg1)  
	print  (vartuple)  

# 调用printinfo 函数  
printinfo(70, 60, 50)

结果:

输出:  
70  
(60,  50)

使用中,*vartuple这个参数可以不使用,也就是只传arg1这一个参数是可以的。

以字典的方式传入

def  printinfo(  arg1, **vardict  ): 
	"打印任何传入的参数"  
	print  ("输出: ")  
	print  (arg1)  
	print  (vardict)  

# 调用printinfo 函数  
printinfo(1, a=2,b=3)

结果:

输出:  
1  
{'a':  2,  'b':  3}

*单独出现

声明函数时,参数中星号*可以单独出现,例如:

def f(a, b, *, c):  
	return a+b+c

如果单独出现星号,*后的参数必须用关键字传入。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> f(1,2,3)  # 报错
Traceback  (most recent call last):  
	File  "<stdin>", line 1,  in  <module>  
TypeError: f() takes 2 positional arguments but 3 were given 

>>> f(1,2,c=3)  # 正常  
6

匿名函数lambda

比如:sum = lambda arg1, arg2: arg1 + arg2,也就是参数: 表达式的形式。

使用方法:sum(1,2)或者是sum(arg1=1, arg2=2)

和函数同理,可以设置默认参数sum = lambda arg1=0, arg2=0: arg1+arg2,同样的,默认参数的位置需要靠后。

强制位置函数

这是python3.8的特性。函数形参语法 / 用来指明:函数形参必须使用指定位置参数,不能使用关键字参数的形式。

def f(a, b, /, c, d,  *, e, f):  
	print(a, b, c, d, e, f)

/之前的参数必须使用指定位置参数。形参 a 和 b 必须使用指定位置参数;

c 或 d 可以是位置形参或关键字形参;

*之后的参数必须使用关键字参数。所以 e 或 f 要求为关键字形参。

f(10, 20, 30, d=40, e=50, f=60)这种使用方法是正确的。

函数内可以访问全局变量,但不能改变其值

如果需要改变全局变量的值,可以使用global方法:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
a = 10
def sum(n):
	global a
	a += n
sum(1); print(a)

可见,a的值变成了11。

函数作为参数

这个一个很有意思的封装。

def execute(f):
	f()

def hello():
	print("hello")

execute(hello)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值