1 函数
- 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
- 函数能提高应用的模块性,和代码的重复利用率。
定义一个函数的格式:
def 函数名():
函数体
- ()中用于存放传入的参数,
- 函数内容以冒号起始,并且缩进
- 要想使用函数 ,必须调用函数
函数名()
2 函数的命名规范
函数名称应该符合标识符的命名规则:
- 可以由字母下划线和数字组成。
- 不能以数字开头
- 不能与关键字重名
3 函数的文档注释及函数调试:
- 函数的文档注释:
应该在定义函数的下方,使用连续的三对引号,编写对函数的说明文字。
在函数调用的位置,使用快捷键Ctrl+Q,可以查看函数的说明信息。
如在定义函数的上方进行注释,则需要和其他代码(或注释)保留两个空行。 - 函数的调试:
F8 Step Over可以单步执行代码,会把函数调用看作一行代码直接执行
F7 Step into可以单步执行代码,如果是函数,会进入函数内部。
4 函数的参数及作用
当有多个参数时,使用逗号隔开
def sum_2_num(num1,num2):
'''两个整数的求和'''
result = num1 + num2
print("%d + %d = %d"%(num1,num2,result))
sum_2_num(2,30)
作用:
函数的参数的可以增加函数的通用性,针对相同的数据处理逻辑,能够适应更多的数据。
- 在函数内部,把参数当做变量使用,进行需要的数据处理
- 函数调用时,按照函数定义的参数顺序,把希望在函数内部处理的数据,通过
参数传递。
5 形参和实参
- 形参(变量):定义函数时,小括号中的参数,是用来接收实参的,在函数内部作为变量使用
- 实参(实实在在的数据):调用函数时,小括号中的参数,是用来把数据传递到函数内部用的。
定义一个函数能够打印任意重复次数的分割线
def print_line(char,time): #形参
print(char * time)
print_line("*",40) ### 实参
6 函数的返回值:
有时会希望一个函数执行结束后,最后给调用者一个结果,以便调用者针对具体的结果做后续的处理。
使用return关键字可以返回结果。而调用函数一方可以使用变量来接收函数的返回值。
注意:
return 表示返回,其后续的代码都不会被执行。
def sum_2_num(num1,num2):
'''两个整数的求和'''
result = num1 + num2
return result
num_result = sum_2_num(2,30)
print(num_result)
当返回值有多个时,可以使用元组
将多个数据存储在元组中。
例如:return one,two
一般情况下需要添加括号
示例:
def test_1():
print("测量温度")
temp = 12
print("测量湿度")
wetness = 20
return temp,wetness
result = test_1() # 返回的是一个元组
print(result)
'''当函数返回元组,希望能够单独的处理元组中的元素
可以使用多个变量一次性接收函数的返回值,
**注意**:使用多个变量接收结果时,变量的个数应该和元组中
元素的个数保持一致。'''
gl_temp,gl_wetness = result
print(gl_temp)
print(gl_wetness)
7 函数的嵌套调用
在一个函数中调用另一个函数。
def test1():
print("#" * 10)
def test2():
print("-" * 10)
test1()
print("-" * 10)
test2()
结果为:
----------
##########
----------
打印五行分割线
def print_line(char,time):
print(char * time)
def print_lines():
i = 0
while i<5:
print_line("*",40)
i += 1
print_lines()
升级版
def print_line(char,time):
print(char * time)
def print_lines(char,time):
i = 0
while i<5:
print_line(char,time)
i += 1
print_lines("-",20)
8 思考
定义函数时,是否接收参数,或者是否返回结果????
- 如果函数内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部。
- 如果希望一个函数执行完成后,向外界汇报执行结果,就可以增加函数的返回值。
9 缺省参数
- 定义函数时,可以给某个参数指定一个默认值,具有默认值的参数叫做缺省参数。
- 调用函数时,如果没有传入缺省参数的值,则在函数内部使用定义函数时指定的参数默认值
num_list = [2,6,1]
num_list.sort()
num_list.sort(reverse=True) #相当于是一个缺省值
缺省参数的注意事项
- 设置缺省值gender = True,一般使用最常见的值作为默认值。而且必须保证带有默认值的缺省参数在参数列表末尾。
def print_info(name,gender = True):
"""
:param name: 姓名
:param gender: True是男生,False是女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s 是 %s "%(name,gender_text))
print_info("小明") #默认是男生
print_info("小红",False) #
结果:
小明 是 男生
小红 是 女生
- 调用带有多个缺省参数的函数。
在调用函数时,如果有多个缺省参数,需要制定参数名。这样解释器才能够知道参数的对应关系。
10 多值参数
有种方式:
1.参数名前增加一个 * ,可以接收元组
2.参数名前增加两个*,可以接收字典。
一般在给多值参数命名时,习惯使用一下两个名字:
*args---存放元组参数,
**kwargs--存放字典参数,
示例:
def demo1(num,*args,**kwargs):
print(num)
print(args)
print(kwargs)
demo1(1,2,3,4,5,name = "小曾")
结果:
1
(2, 3, 4, 5)
{'name': '小曾'}
牛刀小试:计算任意多个数字的和。将传递的所有数字累加并且返回结果。
def sum_numbers(*args):
'''求元组中元素的和'''
num = 0
print(args)
for n in args:
num += n
return num
result = sum_numbers(1,2,3,4,5,6)
print(result)
11 元组和字典的拆包:
在调用带有多值参数的函数时,如果希望:
- 将一个元组变量,直接传递给args.
- 将一个字典变量,直接传递给kwargs
使用拆包,可以简化参数的传递。拆包方式:
- 在元组变量前,增加一个 *
- 在字典变量前,增加两个*
示例:
def demo2(*args,**kwargs):
print(args)
print(kwargs)
gl_nums = (1,2,3,4,5)
gl_dict = {"name":"小曾","age":20}
demo2(*gl_nums,**gl_dict)
demo2(1,2,3,name="小明",age=20)#直接赋值。
结果:
(1, 2, 3, 4, 5)
{'name': '小曾', 'age': 20}
12 函数的递归:
就是函数自己调用自己。函数内部的代码是相同的,只是针对参数不同,处理的结果不同。当参数满足一个条件时,函数不再执行。
示例:求1到100的累加和
### 数字累加 相当于 num + (1+num-1)
def sum_numbers(num):
'''计算1+2+3。。。num的结果'''
#print(num)
#递归的出口,当参数满足某个条件时,不再执行函数。
if num == 1:
return 1
temp = sum_numbers(num - 1)
return num + temp
result = sum_numbers(100)
print(result)