Day11-函数基础
姚万里
1.函数的概念
函数就是实现某一特定功能的代码的封装。 - 不同的函数有不一样的功能
def sumx(N):
sum1 = 0
for x in range(1, N+1):
sum1 += x
print(sum1)
sumx(100)
sumx(50)
2.函数的分类
根据函数是由谁定义的(创建的)将函数分为:系统函数、自定义函数
1)系统函数 - 系统自带的函数(创建Python语言的人创建好的函数) (别人造好的机器),例如:max、min、sum、print、type、input、…
2)自定义函数 - 由程序员自己创建的函数 (自己造的机器)
3.定义函数(创建函数) -造机器
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
def - 关键字;固定写法
函数名 - 由程序员自己命名;
要求:标识符、不是关键字
规范:见名知义(看到函数名大概知道函数的功能)、所有字母都小写,多个单词之间用下划线隔开、
不使用系统的函数名、类名和模块名
(): - 固定写法
形参列表 - 以 ‘变量名1, 变量名2, 变量名3,…’ 的形式存在,这儿的一个变量代表一个形参(也可以一个形参都没有);
形参可以将函数外部的数据传递到函数里面。
定义函数的时候需不需要形参就看实现函数的功能需不需要额外的数据。
函数说明文档 - 本质就是多行注释(相当于机器的说明书)
函数体 - 和def保持一个缩进的一条或者多条语句;
函数体就是实现函数功能的代码。
练习1:定义一个函数统计字符串中中文的个数
def count_chinese(str1):
"""统计字符串中中文的个数"""
count = 0
for x in str1:
if '\u4e00' <= x <= '\u9fa5':
count += 1
print(f'中文个数:{count}')
count_chinese('hsjsf试试l-s=sJs开始')
count_chinese('sfh 江苏省')
练习2:写一个函数,提取列表中所有的数字元素
def get_nums(list1):
"""提取列表中所有的数字元素"""
result = [x for x in list1 if type(x) in (int, float)]
print(result)
练习3:写一个函数,获取指定字典中所有的值
def get_values(dic):
"""获取指定字典中所有的值"""
result = [dic[key] for key in dic]
print(result)
04函数的调用
1.调用函数 - 使用机器
语法:
函数名(实参列表)
说明:
函数名 - 需要调用的函数的函数名(必须是已经定义过的函数的函数名)
() - 固定写法
实参列表 - 以 ‘数据1, 数据2, 数据3,…’ 的形式存在
实参是用来给形参赋值,实参是真正从函数外部传递到函数内部的数据
注意:同一个函数可以在需要它的功能时候反复调用
2.函数调用过程
1)定义函数不会执行函数体,调用函数的时候才会执行函数体
2)执行过程
第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值)
第三步:执行函数体
第四步:确定函数返回值
第五步:回到函数调用的位置,接着往后执行
def func1(x):
# x = 10
print('===============')
print('++++++++++++++++')
# print('abc'[10])
print('------------------华丽的分隔线-----------------')
func1(10)
print('end')
05.函数的参数
1.位置参数和关键字参数 - 实参
1)位置参数
以 ‘数据1, 数据2, 数据3,…’ 的形式存在,让实参和形参从位置上一一对应
(第一个实参给第一个形参赋值,第二实参给第二个形参赋值,…)
2)关键字参数
以 '形参1=实参1, 形参2=实参2,…'的形式存在
3)混用
如果位置参数和关键字参数一起用,那么位置参数必须在关键字参数的前面
“”"
def func1(x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
# 位置参数
func1(10, 20, 30)
func1(20, 10, 30)
# 关键字参数
func1(x=100, y=200, z=300)
func1(y=200, z=300, x=100)
# 位置参数和关键字参数一起用
func1(10, y=20, z=30)
func1(10, z=30, y=20)
func1(10, 20, z=30)
# func1(x=10, 20, z=30) # SyntaxError: positional argument follows keyword argument
2.参数默认值 - 形参
定义函数的时候可以用 ‘形参=值’ 的方式给参数赋默认值;
调用函数的时候有默认值的参数可以不用传参。
如果定义函数的时候有的参数有默认值,有的参数没有默认值,没有默认值的参数必须在有默认值参数的前面
def func2(x=10, y=20, z=30):
"""func2"""
print(f'x:{x}, y:{y}, z:{z}')
func2()
func2(100)
func2(100, 200)
func2(100, 200, 300)
func2(y=200)
func2(z=300)
def func3(x, y=20, z=30):
print(f'x:{x}, y:{y}, z:{z}')
3.参数类型说明 - 形参
情况1:没有默认值的参数,在参数后加 ‘:类型名’
情况2:有默认值的参数,值的类型就是参数的说明类型
def func5(str1: str, list1=[]):
pass
4.*不定长参数 (了解) - 形参
1)带的不定长参数
在定义函数的时候可以在某个参数前加,那么这个带的参数就是一个不定长参数,可以同时接收多个实参。
带的参数会自动变成一个元组,接收到实参是元组中的元素。
调用的时候带*的不定长参数必须用位置参数传参
2)带**的不定长参数(了解)
def func6(*x):
print(x)
func6()
func6(10)
func6(10, 20)
func6(10, 20, 30, 40, 50)
练习:定义一个参数可以求多个数的和
sum1(10, 20)
sum1(10, 20, 30)
sum1(90, 8, 78, 27, 17)
def func9(**x):
print(f'x:{x}')
func9() # {}
func9(a=10) # {'a': 10}
func9(m=100, n=200) # {'m': 100, 'n': 200}
func9(name='余婷', age=19) # {'name': '余婷', 'age': 19}
func9(name='小明', age=20, gender='男', hobby='篮球') # {'name': '小明', 'age': 20, 'gender': '男', 'hobby': '篮球'}
# 保证func10调用的时候足够灵活
def func10(*args, **kwargs):
pass
func10()
func10(10, 20)
func10(a=10, b=23)
func10(10, 20, x=10, y=23)
06函数返回值
1.返回值
1)返回值的意义
返回值就是从函数内部传递到函数外部的数据
2)怎么确定函数返回值
返回值就是return关键字后面的表达式值(执行函数体的是如果遇到return,return后面是什么,函数返回值就是什么)
如果没有遇到return,返回值None
3)怎么在函数外部使用函数返回值
函数调用表达式的值就是函数的返回值,所以返回值能做的事情,函数调用表达式都可以做
函数调用表达式 - 调用函数的语句
def func1():
print('abc')
return 100
result = 100
result = func1() # 100
print(f'result: {result}')
print(100, func1())
print(100 * 2, func1()*2)
list1 = [100, func1(), 200]
print(list1)
def func2(x: str):
# x = 'abc'
return x*2 # return 'abc'*2 -> return 'abcabc'
func2('abc') # 'abcabc'
print(func2('abc')[-1]) # 'abcabc'[-1] -> 'c'
# print('abcabc'[-1])
def func3():
return [10, 20]
result = func3() # result = [10, 20]
result.append(100)
print(result)