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)
本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16761367.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!