该文章内容整理自《Python编程:从入门到实践》、《流畅的Python》、以及网上各大博客
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。它能提高应用的模块性,和代码的重复利用率。当函数不使用return返回值时,函数返回None。但是在函数有异常时不推荐返回None。其一般形式为
def functionname(parameters):
function_suite
return [expression]
参数
参数传递
当参数为不可变类型,如整数、字符串、元组等类型时,则类似C语言的值传递,函数内部的修改不会影响到原来参数的值;当参数为可变类型,如列表,字典,类对象时,则类似C语言的引用传递,函数内部的修改会影响原来参数的值。因为 Python 中一切皆对象,所以严格意义上并不分值传递和引用传递,而是类似于C语言中的指针参数,参数本身是不可变的,不影响实参的,但是参数指向的对象则是可变的,影响实参的
默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值。但是注意这个默认值只在模块启动时加载,后面运行时不会再加载。这意味着这个默认值不能够是一个动态变化的值。如
import datetime
import time
#def log1(msg, when=datetime.datetime.now()):
# print('%s:%s' %(when,msg)) # 两次输出的时间一样
def log(msg, when=None):
if when is None:
when = datetime.datetime.now()
print('%s:%s' %(when,msg))
log('hi,first')
time.sleep(1)
log('hi,second')
不定长参数
当函数需要处理比当初声明时更多的参数时,这些参数叫做不定长参数。在参数名前加上 *,则会将多出来的参数封装成一个元组。如
def printinfo(arg1, *vartuple):
print("arg1: ", arg1)
print(type(vartuple))
for var in vartuple:
print(var)
printinfo(1, 2, 3, 4, 5, 6)
关键字参数
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。并且,在参数名前加上 **,则会将多出来的关键字名-值对封装成字典。如
def printinfo(name, age, **kw):
print("Name: ", name)
print("Age ", age)
print(type(kw))
printinfo(age=18, name="Ben",<