函数
函数,是一个可以提供代码复用的有效手段
在python中,也是可以定义一些函数的,但是这些函数有着如下的特点:
- 以关键字
def开头,接着是函数名 + + +参数列表() - 函数体,以
:开始,并且缩进 - return [表达式],表示结束函数调用,返回给调用放;不带表达式的
return相当于返回None
def Printf(str):
print(str)
if __name__ == '__main__' :
Printf('hello world')
参数的传递
在python中,类型属于对象,我们在函数体重定义的变量是没有类型的
a = [1,2,3]
a = "hello world"
a = 3
上述程序中,
[
1
,
2
,
3
]
[1,2,3]
[1,2,3]是list类型,
h
e
l
l
o
w
o
r
l
d
hello world
helloworld是String类型,
3
3
3是Number类型,而变量a是没有类型的,仅仅是对象的一个引用,可以指向list,String或者Number类型的对象,都是没有影响的
另外,对于这些类型的对象,又分为可更改的对象与不可更改的对象:
- 可更改的对象,修改对象的值,该变量的引用不发生变化。比如:list,dict
- 不可更改的对象,修改对象的值,那么变量所引用的对象也一起发生变化。比如:string ,Number,tuples
print("Number 对象")
a = 3
print("a 的地址 -> ",id(a))
a = 4
print("修改后 a 的地址 -> ",id(a))
print("String 对象")
str = "hello wordl"
print("str 的地址 -> ",id(str))
str = "world hello"
print("修改后 str 的地址 -> ",id(str))
print("list 对象")
list = [1,2,3,4,5]
print("list 的地址 -> ",id(list))
list[2] = 7
print("修改后 list 的地址 -> ",id(list))

那么,Python在函数传递参数的过程中,就需要注意这两类的对象:
- 不可变类型的对象:所传递的只是对象的值,如果发生修改,并不会影响到对象本身
def change(a):
print(id(a)) # 指向的是同一个对象
a = 10
print(id(a)) # 一个新对象
a = 1
print(id(a))
change(a)

- 可变类型的对象:采用引用的方式进行传递,在函数体中修改了对象的值后,在函数外部该对象也会被修改
# 可写函数说明
def changeme( mylist ):
"修改传入的列表"
mylist.append([1,2,3,4])
print ("函数内取值: ", mylist)
return
# 调用changeme函数
mylist = [10,20,30]
changeme( mylist )
print ("函数外取值: ", mylist)

参数的类型
- 必须参数
def function( str ) :
print(str)
function("hello")
就是我们在调用函数的时候,必须传递一个参数,不然会出现语法错误
function()
TypeError: function() missing 1 required positional argument: 'str'
- 关键字参数
def function( str, a ) :
print(str, a)
function(a = 3,str = "hello")
类似于这样,我们在调用函数的时候,可以不按照函数参数中变量的顺序进行传递,但是必须根据参数名进行匹配参数值
- 默认参数
def function( str, a = 5 ) :
print(str, a)
function(str = "hello")
可以在参数列表中,显示的为某一个参数附一个默认值,如果在传递参数时,没有指定该变量的值,那么将使用该默认值

他也满足C++中,如果是半缺省的参数,必须都在参数列表的右侧
- 不定长参数
def function( str, *valTuple) :
print(str)
print(valTuple)
function( "hello",0,1,2,3,4)
- 加了星号
∗
*
∗的参数会以
元组(tuple)的形式导入,存放所有未命名的变量参数
def function( str, *valTuple) :
print(str)
print(valTuple)
function(str="hello")
这种情况下,表示不定长参数为一个空元组
在使用不定长参数的时候,就不可以使用关键字参数了

- 两个星号 ∗ ∗ ** ∗∗ 的参数会以字典的形式导入
def function( str, **valTuple) :
print(str)
print(valTuple)
function(str="hello",a=2,c=3)

匿名函数
python 中使用lambda来创建匿名函数,也就是说,函数可以不用def来定义了
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法
lambda [arg1 [,arg2,.....argn]]:expression
具体的实例:
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print("相加后的值为 : ", sum(10, 20))
print("相加后的值为 : ", sum(20, 20))
本文深入解析Python函数的参数传递机制,区分可变与不可变对象,介绍默认参数、关键字参数、不定长参数和匿名函数(lambda表达式),帮助理解函数在实际编程中的运用和技巧。
4968

被折叠的 条评论
为什么被折叠?



