点我
函数
作用:代码的复用
基本语法
函数语法格式:
def 函数名([参数列表]):
'''注释'''
函数体
注意事项
- 不需要说明形参的数据类型,python解释器会根据实参的值自动推断形参类型
- 不需要指定函数返回值类型,由函数中return语句返回的值来确定
- 函数即使不需要接收任何参数,也必须保留一对空的圆括号
- 函数括号后面的冒号:必不可少
- 函数体相对于def关键字,必须保持一定的空格缩进
函数调用
函数名([实参列表])
>>> def d(a,b,c):
print(a,b,c)
>>> d(1,2,'a')
>>> def demo():
x = 10
y = 10
print(x,y)
>>> demo()
10 10
函数返回值
返回值是函数在完成工作后,最后给调用者的一个结果
在函数中使用关键字return 返回结果
return 表示返回,后续的代码都不会被执行
>>> def sum_2(num1,num2):
return num1 + num2
>>> res = sum_2(10,40)
>>> print("结果为{}".format(res))
结果为50
函数嵌套
在函数中调用函数
def test1():
print('*' * 10)
def test2():
print('-' * 10)
test1()
test2()
递归函数
递归调用:在一个函数中直接或间接地调用函数自身(函数在内部调用函数本身)
在编写递归函数时,应注意以下几点:
- 每次递归应保持问题性质不变
- 每次递归应使用更小或更简单的输入
- 必须要保证递归过程可以结束
- 函数递归深度不能太大,否则会引起内存崩溃
函数参数
函数可以有多个形参,使用逗号隔开,也可以没有形参,但圆括号必须要有,表示这是一个函数并且不接收参数
调用函数时向其传递实参,将实参的引用传递给形参
位置参数
调用函数时,实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同
>>> def d(a,b,c):
print(a,b,c)
>>> d(1,2,'a')
1 2 a
>>> d(1,2)
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
d(1,2)
TypeError: d() missing 1 required positional argument: 'c'
>>> d(1,2,3,4)
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
d(1,2,3,4)
TypeError: d() takes 3 positional arguments but 4 were given
>>> d(3,2,1)
3 2 1
默认值参数
可以为形参设置默认值
在调用带有默认值参数的函数时,可以不为设置了默认值的形参进行传参
在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误
语法:def (....,形参名=默认值):函数体
>>> def b(a,b,c=2):
print(a,b,c)
>>> b(3,'a')
3 a 2
如果对设置了默认值的参数传参,将不再使用默认值,而是使用调用者显式传递的值
>>> b(3,'a','b')
3 a b
可变长度参数
- 参数长度不固定,可以为0个或者多个
- 使用多个参数以逗号分开
- 接收任意多个位置实参并将其放在一个元组中
- 定义时 使用 *参数名的形式
- 调用时 使用多个参数时以逗号隔开或者*参数名的形式
>>> def demo(*p):
print(p)
>>> demo(1,2,3,4,5,'a')
(1, 2, 3, 4, 5, 'a')
>>> demo(1,2)
(1, 2)
例子:求各参数的平方
def calc(*nums):
sum = 0
for i in nums:
sum = sum +i * i
return sum
>>> calc(1,2)
5
关键字参数
- 参数长度不固定,可以为0个或者多个
- 所有参数以字典的格式传入
- 定义时 形参使用 **参数名 的形式
- 调用时 使用 key=value 的方式 或者 **参数的形式
def introduce(name,gender,**kw):
#print(kw)
print("我是{},一个{}生,其他信息{}".format(name,gender,kw))
#调用
introduce("李四","女",age=19,city="成都")
introduce("李四","女",age=19,city="成都",state ="singledog")
#结果
我是李四,一个女生,其他信息{'age': 19, 'city': '成都'}
我是李四,一个女生,其他信息{'age': 19, 'city': '成都', 'state': 'singledog'}
命名关键字参数
- 当希望对关键字参数进行限制时,只要接受某几个key作为关键字参数
- 定义时,用一个*单独作为参数,后面的所有参数都是规定好的关键字参数(如函数定义中已经有一个可变参数,后面跟着的命名关键字参数就不需要*了)
- 调用时,必须使用key=value模式,而且key必须是定义时的key
注意:命名关键字参数可以有缺省值,从而简化调用
def introduce1(name,gender,*,age,city):
print("我是{},一个{}生,今年{}岁,家住{}".format(name,gender,age,city))
#调用
introduce1('zs','男',age=20,city='北京')
我是zs,一个男生,今年20岁,家住北京
#调用时还是以参数名=参数值,但可以不写有默认值的参数,如列表的sort方法
def introduce2(name,gender,*,age=18,city="成都"):
print("我是{},一个{}生,今年{}岁,家住{}".format(name,gender,age,city))
#调用
introduce2('zs','女')
我是zs,一个女生,今年18岁,家住成都、
#如果和可变参数结合,命名关键字参数必须放到可变参数后面
#而且需要去掉命名关键字参数自带的那个*,如print方法
def introduce3(name,gender,*args,age=18,city="成都"):
print("我是{},一个{}生,其他信息{},今年{}岁,家住{}".format(name,gender,args,age,city))
#调用
introduce3('zs','男女')
我是zs,一个男女生,其他信息(),今年18岁,家住成都
参数组合
以上5中参数可以在函数定义时组合使用
参数定义的顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数
如果定义一个 func(args, *kw)的形式的函数,调用时无论传入什么参数都是可以的
变量作用域
变量起作用的代码范围称为变量的作用域,不同作用域内的同名变量之间互不影响
如果想要在函数内部修改一个定义在函数外的变量值,必须使用 global 明确声明,否则会自动创建新的局部变量
>>> def demo():
x = 10
y = 10
print(x,y)
>>> x = 5
>>> x
5
>>> demo()
10 10
>>> x
5
>>> def demo1():
global x
x = 10
y =10
print(x,y)
>>> x
5
>>> demo1()
10 10
>>> x
10
分类:
Python
版权申明
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论