四 函数
4.1 函数
1.函数的作用
函数存在的价值:当一个功能需要反复使用的时候,如果没有函数每次需要这个功能,这个功能就必须把实现这个功能的代码写一遍。
如果有函数实现功能对应的代码只需要写一遍(封装成函数),每次使用功能的时候就调用这个功能的函数。
# 1+2+...+100
# 1+2+...+50
# 1+2+...+200
sum1=0
for i in range(0,101):
sum1+=i
print(sum1) #505
def sum(num):
sum1=0
for i in range(0,num+1):
sum1+=i
print('和:',sum1)
sum(100) #和: 5050
sum(50) #和: 1275
# 提取字符串中的数字
def t(str1):
str2=''
for i in str1:
if i.isdigit():
str2+=i
print(str2)
str1='456y7uikol'
t(str1) #4567
2.认识函数
(1)什么是函数(机器)
定义:函数就是实现某一特定功能代码的封装。
(函数就是将实现某一个或者某一类功能的代码打成一个包,以后在需要这个包装的这段代码对应功能的时候不用重新写这段代码,而是
使用封装的这段代码的函数)
(2)函数的分类
根据这个函数是由谁创建的,可以将函数分为系统函数和自定义函数两种
a.系统函数(别人已经造好的机器) - 由系统创建的函数(python本身创建好的函数),例如:print、input、type、max、min等
b.自定义函数(自己造机器) - 由程序员自己创建的函数
(3)定义函数(造机器)
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
1)def - 关键字;固定写法
2)函数名 - 由程序员自己命名:(两个要求:是标识符;不是关键字
三个要求:见名知义(看到函数名就知道函数的功能)
所有的字母都小写,多个单词用下划线隔开
不使用系统的函数名、类名和模块)
3)() - 固定写法
4)形参列表 - 以’变量名1,变量名2,变量名3…'的形式存在,根据情况变量的数据可以为0(每一个变量就是一个形参)。
形参的作用:将函数外部的数据传递到函数里面。
确定形参的方法:看实现函数的功能需不需要额外的数据,需要多少个额外的数据。
5)函数说明文档 - 多行注释(相当于生活中机器的说明书)
6)函数体 - 结构上,和def保持一个缩进的一条或者多条语句
逻辑上,函数体就是实现函数功能的代码。
# 定义一个函数求一个数的阶乘
def factoriod(num):
"""
(功能说明区)求一个数的阶乘:num!
:param num:(参数说明)求阶乘的对象
:return:(返回值说明)None
"""
fact = 1
for i in range(1,num+1):
fact *= i
return fact
print(factoriod(5))
# 定义一个函数求两个数的乘积
# def product(num1,num2)
nums=[42,79,254,36]
print(max(nums))
# 练习1:定义一个函数统计字符串中数字字符的个数
def statistical(str1):
count = 0
for i in str1:
if i.isdigit():
count +=1
print(count)
statistical('ty6787y756')
# 练习2:定义一个函数,将两个字符串中所有的大写字母合并成一个新的字符串
def merge_str(str1,str2):
new_str = ''
for i in str1 + str2:
if i.isupper():
new_str += i
print(new_str)
str1 = '45Y6TtRF5'
str2 = '567YT567'
merge_str(str1,str2)
# 练习3:定义一个函数,删除列表中所有的空值(包括None,和其他空值(比如空字符串、空列表、空元组等)
def remove_null(list1):
for i in list1[:]:
if not i and i != 0:
list1.remove(i)
print(list1)
remove_null(['',{},None,9,(),0])
# 条件对应的表达式如果不是布尔,就转换成布尔值看结果是否为True(0值和空值都是False)
4.2 调用函数
1.调用函数(请使用函数 - 使用机器)
重点:提供数据时必须用形参来提供数据
语法:
函数名(实参列表)
说明:
1)函数名 - 需要调用哪个函数对应的功能就调用哪个函数;想要调用哪个函数就用哪个函数的函数名
注意:函数名必须是已经定义过的函数的函数名
2)() - 固定写法
3)实参列表 - 以’数据1,数据2,数据3…'的形式存在,这儿的每个数据就是一个实参。(实参对应的数据可以是任何有结果的表达式)
实参是用来给形参赋值的,在提供实参要保证和形参一一对应。
重要结论:定义函数不会执行函数体,调用函数的时候才会执行
2.函数调用过程
每次在调用函数的时候,它的执行步骤:
第一步:回到函数定义的位置;
第二步:传参(用实参给形参赋值),传参的时候必须保证每个形参都有值;
第三步:执行函数体;
第四步:确定函数返回值;
第五步:回到函数调用的位置,接着往后执行
def fun4(x,y,z):
print(f'x:{x},y:{y},z:{z}')
fun4(100,200,300) #x:100,y:200,z:300
*3.关于形参几种错误的写法
# 错误1:
str1='456yuhgfrt'
def count_nums(): #没有形参和实参
count =0
for i in str1:
if i.isdigit():
count+=1
print(count)
count_nums() #没有实参
# 错误写法2:
def count_nums(): #没有形参和实参
str1 = '456yuhgfrt' #换不了,只能调这一个数据
count =0
for i in str1:
if i.isdigit():
count+=1
print(count)
count_nums() #没有实参
#正确写法:
def count_nums(str1):
count =0
for i in str1:
if i.isdigit():
count+=1
print(count)
str1='456yuhgfrt'
count_nums(str1) #3
# 定义一个函数求5的阶乘
def faction(N):
num = 1
for i in range(1,N+1):
num *= i
print(num)
faction(5) #120
4.3函数的参数
1.位置参数和关键字函数
根据实参的提供方式将实参分为位置参数和关键字参数
1)位置参数:以’实参1,实参2,实参3…'的形式存在,让实参和形参在位置上一一对应
2)关键字参数(不影响赋值结果,强调关键字):以’形参1=实参1,形参2=实参2…‘的形式存在,通过’='将形参和实参对应
注意:位置参数和关键字参数可以一起用,但是位置参数必须在关键字参数前面
def func1(x,y,z):
print(f'x:{x},y:{y},z:{z}')
func1(10,20,30) #x:10,y:20,z:30
func1(20,10,30) #x:20,y:10,z:30
func1(y=20,x=10,z=30) #x:10,y:20,z:30
func1(10,20,z=30) #x:10,y:20,z:30
# func1(x=10,20,z=30) #报错!!!
2.参数默认值
定义:函数的时候可以通过’形参名=数据’的方式给形参赋默认值,在调用函数的时候,有默认值的参数可以不用传参。
注意:定义函数的时候,如果一个函数有的参数有默认值,有的没有默认值,没有默认值的形参必须在有默认值的形参的前面
def func2(x=10,y=20,z=30):
print(f'x:{x},y:{y},z:{z}')
func2() #x:10,y:20,z:30
func2(100) #x:100,y:20,z:30
# 如果想跳过前面有默认值的参数,直接给后面的参数赋值,使用关键字传参
func2(z=300) #x:10,y:20,z:300
3.参数类型说明
没有默认值参数的类型说明:直接在形参后面加’:类型名’
有默认值的参数,默认值数据对应的类型就是这个形参的类型
def func3(x: str,y='') ->str:
x.strip()
y.strip()
print()
4.*对应的不定长参数
1)参数个数不确定可以使用不定长参数
定义函数的时候,如果在某一个形参前面加*,那么这个形参就会变成不定长参数,它可以接收多个实参
带*号的不定长参数的本质是元组,它接收到的所有的实参是这个元组的元素.
# 示例:定义函数求多个数的和
def sumM(*num1):
sum1=0
for i in num1:
sum1 +=i
print(sum1)
sumM(10,12,382) #404
# 优化:求和的时候至少两个参数
def sumN(num1,num2,*nums):
sum1=num1+num2
for i in nums:
sum1 +=i
print(sum1)
sumN(10,20,30,40) #100
# 示例:定义一个函数收集学生信息
def get_stu_info(name,age,*awards):
print(awards) #('三好学生', '优秀干部')
print(f'{name}今年{age}是{awards}') #小米今年18是('三好学生', '优秀干部')
get_stu_info('小米',18,'三好学生','优秀干部')
2)定义函数的时候单独使用*号
如果定义函数的时候,形参列表中有一个独立的*,调用函数的时候*后面的所有的形参必须使用关键字传参
def func4(x,*,y,z): #形参里面出现独立的*时,需要对*后面的形参用关键字传参(无论什么时候看见独立的*就要弄后面的)
print(x,y,z)
func4(10,y=10,z=10)
def func5(x,*y,z): #*后面也是需要关键字传参
pass
func5(20,20,230,3939,z=29)
今日作业
-
编写一个函数,交换指定字典的key和value。
例如:dict1={'a':1, 'b':2, 'c':3} --> dict1={1:'a', 2:'b', 3:'c'}
def exchange(dict1:dict): dict2={j:i for i,j in dict1.items()} print(dict2) exchange({'a':1, 'b':2, 'c':3})
-
编写一个函数,提取指定字符串中所有的字母,然后拼接在一起产生一个新的字符串
例如: 传入'12a&bc12d-+' --> 'abcd'
def get_letter(str1:str): str2='' for i in str1: if i.isalpha(): str2 +=i print(str2) get_letter('12a&bc12d-+')
-
写一个自己的capitalize函数,能够将指定字符串的首字母变成大写字母
例如: 'abc' -> 'Abc' '12asd' --> '12asd'
def get_initial(str3:str): str1='' for i in range(len(str3)): if i==0: if 'a'<=str3[i]<='z': new_=chr(ord(str3[i])-32) str1 +=new_ else: str1 +=str3[i] print(str1) get_initial('abc')
-
写一个自己的endswith函数,判断一个字符串是否已指定的字符串结束
例如: 字符串1:'abc231ab' 字符串2:'ab' 函数结果为: True 字符串1:'abc231ab' 字符串2:'ab1' 函数结果为: False
def is_assign(str1:str,str2:str): if str1[-len(str2):] == str2: print(True) else: print(False) is_assign('abc231ab','ab') is_assign('abc231ab','ab1')
-
写一个自己的isdigit函数,判断一个字符串是否是纯数字字符串
例如: '1234921' 结果: True '23函数' 结果: False 'a2390' 结果: False
def is_digit(str3:str): if str3.isdigit(): return True else: return False print(is_digit('1234921')) is_digit('a2390')
-
写一个自己的upper函数,将一个字符串中所有的小写字母变成大写字母
例如: 'abH23好rp1' 结果: 'ABH23好RP1'
def get_capital(str1:str): new_str1 = '' for x in str1: if 'a' <= x <= 'z': new_str1 += chr(ord(x) - 32) else: new_str1 += x print(new_str1) get_capital('abH23好rp1')
-
写一个自己的rjust函数,创建一个字符串的长度是指定长度,原字符串在新字符串中右对齐,剩下的部分用指定的字符填充
例如: 原字符:'abc' 宽度: 7 字符:'^' 结果: '^^^^abc' 原字符:'你好吗' 宽度: 5 字符:'0' 结果: '00你好吗'
def fill_num(str5:str,nums,character): print(str5.rjust(nums,character)) fill_num('abc',7,'^') fill_num('你好吗',5,'0')
-
写一个自己的index函数,统计指定列表中指定元素的所有下标,如果列表中没有指定元素返回-1
def my_index(list1, value):
list_length = len(list1)
index_list = []
if value not in list1:
print(-1)
else:
for i in range(list_length):
if list1[i] == value:
index_list.append(i)
print(index_list)
my_index([1, 2, 45, 'abc', 1, '你好', 1, 0], 1)
-
写一个自己的len函数,统计指定序列中元素的个数
例如: 序列:[1, 3, 5, 6] 结果: 4 序列:(1, 34, 'a', 45, 'bbb') 结果: 5 序列:'hello w' 结果: 7
def count_num(list2): count =0 for i in list2: if i or i ==0: count+=1 print(count) count_num((1, 34, 'a', 45, 'bbb'))
-
写一个自己的max函数,获取指定序列中元素的最大值。如果序列是字典,取字典值的最大值
例如: 序列:[-7, -12, -1, -9] 结果: -1 序列:'abcdpzasdz' 结果: 'z' 序列:{'小明':90, '张三': 76, '路飞':30, '小花': 98} 结果: 98
def max(seq): if type(seq) == dict: seq = list(seq.values()) max1 = seq[0] for x in seq[1:]: if x > max1: max1 = x print(max1) seq = [-7, -12, -1, -9] max(seq)
-
写一个函数实现自己in操作,判断指定序列中,指定的元素是否存在
例如: 序列: (12, 90, 'abc') 元素: '90' 结果: False 序列: [12, 90, 'abc'] 元素: 90 结果: True
def is_exist(list5,num): for i in list5: if i == num: print('True') break else: print('False') list5=[12, 90, 'abc'] num=90 is_exist(list5,num)
-
写一个自己的replace函数,将指定字符串中指定的旧字符串转换成指定的新字符串
例如: 原字符串: 'how are you? and you?' 旧字符串: 'you' 新字符串:'me' 结果: 'how are me? and me?'
def new_(str1,old,new):
result = new.join(str1.split(old))
print(result)
str1 = 'how are you? and you?'
old = 'you'
new = 'me'
new_(str1,old,new)