在我们尚未学习Python函数之前,程序都是自上而下依次执行这种理解是没有问题的。
如果我们需要重复使用某段代码时,是不是需要将此代码复制多次使用呢?如果这样会影响我们的开发效率、而且代码也会显得非常冗余。
这时候就需要我们的Python函数了。我们可以将一段需要重复调用的代码块封装为函数,每次使用时只需调用即可、十分方便。
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。

什么是函数
创建函数

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
让我们使用函数来输出”Hello World!”:
'''
函数语法:
def 函数名(参数列表):
函数体
'''
#定义函数
def hello():
print('hello world!')
hello()
#hello world!
'''
函数语法:
def 函数名(参数列表):
函数体
'''
#定义函数
def max(a, b):
if a > b:
print(a)
else:
print(b)
max(1, 8)
#8
函数调用
定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。
#定义一个输入什么输出什么的字符串函数
def output(str):
print(str)
return
#调用函数
output('我是AAAAA')
output('CCCCC')
'''
我是AAAAA
CCCCC
'''
参数传递
在调用函数时,大多数情况下,主调函数和被调函数存在数据传递关系。函数参数的作用是传递数据给函数使用。函数参数的定义是在函数名称后的花括号之内。
python中定义函数时,函数名后面的括号中如果有内容,括号里的内容称为“形参”。代码示例如下,其中name为形参:
#函数定义
def greeting(name):
print("Hello,"+name.title()+"!")
如果函数定义时有形参,则调用这个函数时需提供实质的参数,调用时的参数称为“实参”。代码示例如下,其中“泡芙”为实参:
#函数定义
def greeting(name):
print("Hello,"+name.title()+"!")
#函数调用
greeting('泡芙')
'''
Hello,泡芙!
'''
我们可以根据实参的类型不同,又可以分为将实参的值传递给形参;将实参的引用传递给形参两种情况。
当实参为不可变对象时进行的是值传递;
当实参为可变对象时进行的是引用传递;
这里需要给大家普及一个Python中的基础,在python中,string(字符串), tuples(元组), 和number(数值)是不可更改的对象;
而list(列表),dict(字典)等则是可以修改的对象。
区别在于进行值传递之后可以改变形参的值,实参的值;
引用传递既可以改变形参的值也可以改变实参的值。
#函数定义
def out(obj):
print('原值:', obj)
obj += obj
print('值传递------------------------')
obj = '人民有信仰,国家有力量,民族有希望!'
print('函数调用前:', obj)
out(obj)
print('函数调用后:', obj)
#引用传递
print('引用传递------------------------')
obj = ['张三','李四','王麻子']
print('函数调用前:', obj)
out(obj)
print('函数调用后:', obj)
'''
值传递------------------------
函数调用前: 人民有信仰,国家有力量,民族有希望!
原值: 人民有信仰,国家有力量,民族有希望!
函数调用后: 人民有信仰,国家有力量,民族有希望!
引用传递------------------------
函数调用前: ['张三', '李四', '王麻子']
原值: ['张三', '李四', '王麻子']
函数调用后: ['张三', '李四', '王麻子', '张三', '李四', '王麻子']
'''
可以很清晰地看到,进行值传递时,改变的是形参的值,实参值不变;
进行引用传递时,改变的是形参的值和实参的值。
位置参数
1.参数数量必须与定义时一致。不然就会报TypeError的异常。
def add(a,b,c):
print(a+b+c)
add(1,3)
#TypeError: add() missing 1 required positional argument: 'c'
def person_info(name,age,sex):
print('{}的个人信息:年龄{},性别:{}'.format(name,age,sex))
'''
person_info('张三',23,'男')
张三的个人信息:年龄23,性别:男
'''
person_info('张三','男',23)
#张三的个人信息:年龄男,性别:23
关键字参数
def person_info(name = '张三', age = 18, sex='男'):
print('{}的个人信息:年龄{},性别:{}'.format(name,age,sex))
person_info()
'''
张三的个人信息:年龄18,性别:男
'''
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
#定义printinfo函数
def printinfo(name, age=35):
print("名字: ", name)
print("年龄: ", age)
return
#调用printinfo函数
printinfo(age = 42, name = "张三丰")
printinfo(name = "张无忌")
'''
名字: 张三丰
年龄: 42
名字: 张无忌
年龄: 35
'''
可变参数
可变参数也被称为不定长参数。指的是传入的实参可以是1个、2个或者多个。主要有两种形式:
*参数
**参数
第一种*形式代表接受任意多个参数并且将其放入到一个元组中,调用3次分别传入不同数量的值。
#定义你喜欢的选手参数
def likeplayer(*name):
print('我喜欢的LOL选手是:')
for item in name:
print(item)
likeplayer('宋义进')
likeplayer('The shy','Rookie','泡芙')
likeplayer('The shy', '宋义进', '泡芙', 'xun', 'Ning', 'Lucas')
'''
我喜欢的LOL选手是:
宋义进
我喜欢的LOL选手是:
The shy
Rookie
泡芙
我喜欢的LOL选手是:
The shy
宋义进
泡芙
xun
Ning
Lucas
'''
若是使用一个已经存在的列表作为函数的可变参数,可在列表名称前*,如下:
#定义你喜欢的选手参数
def likeplayer(*name):
print('我喜欢的LOL选手是:')
for item in name:
print(item)
name = ['The shy', '宋义进', '泡芙', 'xun', 'Ning', 'Lucas']
likeplayer(*name)
'''
我喜欢的LOL选手是:
The shy
宋义进
泡芙
xun
Ning
Luca
'''
第二种**形式表示接收任意多个参数将其存入一个字典。
#定义函数
def printinfo(arg1, **vardict):
print(arg1)
print(vardict)
#调用函数
printinfo(666, a = 1, b = 2, c = 3, d = 4)
'''
666
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
'''
同样若是使用一个已经存在的字典作为函数的可变参数,可在列表名称前**,如下:
#定义函数
def printinfo(arg1, **vardict):
print(arg1)
print(vardict)
#调用函数
dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
printinfo(888, **dict)
'''
888
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
'''
转载请注明:XAMPP中文组官网 » Python函数与模块:聊聊Python函数大全