函数相关
函数的作用
1.什么是函数
函数就是实现某一特定代码的封装
(函数就是把实现某一个功能的代码打成一个包,以后在需要这段代码的功能的时候,而是直接调用封装这段代码的函数)
2.函数分类
1.系统函数 = python 自带的函数,例如:print、input、type,max,im,sorted等
2.自定义函数: - 由程序员自己创建的函数
3.定义函数/创建函数 - 造机器
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
def - 关键字;固定写法
函数名 - 由程序员自己命名,但是碧玺符合命名要求和规范
注意:要是标识符;不能用关键字
规范:见明知义(看到函数名大概知道功能;字母都小写,多个单词用下划线隔开。
不适用系统的函数名、类名、模块名
(): - 固定写法
形参列表 - 以’变量名1,变量名2…变量名n’的形式存在,这儿的变量名可以有也可以没有
形参的作用:将函数外部的东西传入函数内部
函数说明文档 - 本质就是一个多行注释,用来描述函数的功能和使用方法
函数体 - 结构上:和def保持一个缩进的一条或者多条语句(至少一条)
- 逻辑上:函数体就是实现函数功能的代码
示例:
# 练习:定义一个函数求任意两个数的和
def sum1(x, y):
'''
求两个数的和(函数功能说明)
:param x: 第一个数(参数说明)
:param y: 第二个数
:return: None(返回值说明)
'''
s = x + y
print(s)
sum1(3, 4)
# 练习1:定义一个函数,统计指定字符串中中文的个数
def count1(str1):
s = 0
for i in str1:
if '\u4e00' <= i <= '\u9fa5':
s += 1
print(s)
count1('张三12312321312')
# 练习2:定义一个函数,将指定的数据插入到指定列表的最前面
def s_1(list1, x):
list1.insert(0, x)
print(list1)
# 练习3:定义一个函数,任意一个整数的阶乘
def s_2(x):
s = 1
for i in range(2, x + 1):
s *= i
print(s)
# 练习4:定义一个函数,求任意一个圆的面积
def s_3(x):
s = math.pi * x ** 2
print(s)
s_3(2)
s_1([0, 1, 3], 5)
函数的调用
1)定义函数不会执行循环体,调用函数才会执行函数体
2)怎么调用函数
‘’’
语法:函数名(实参列表)
说明:
函数名 - 需要那个函数的功能就调用那个函数,就写那个函数的函数名
(注意:函数名必须是已经定义好的函数的函数名)
() - 固定写法
实参列表 - 以’数据1,数据2,数据3,…,‘的形式存在
实参就是通过形参从函数外部传递到函数内部具体的数据(实参是用来给形参赋值)
‘’’
3)函数调用过程
当代码执行到函数调用语句的时候:
第一步:先回到函数定义的位置
第二步:传参(用实参给形参赋值)
第三步:执行函数体
第四步:确定函数返回值
第五步:回到函数调用的位置,继续执行下面的语句
函数的返回值
1.返回值
返回值就是从函数内部传递到函数外部的数据
- 怎么确定函数返回值(怎么将指定的数据作为函数的返回值)
看执行函数体的时候有没有遇到return,如果遇到return,return后面的值就是函数的返回值;如果没有遇到retrun,返回值是None - 怎么获取函数的返回值
获取函数调用表达式的值就是获取函数的返回值
(每个函数调用表达式都有结果,结果就是返回值;所以函数返回值能做的事,函数调用都能做)
函数调用表达式:调用函数的语句 - 什么时候需要返回值
如果实现函数的功能产生了新的数据,我们就应该将新的数据返回
原因:每次调用函数的时候,系统会自动为这个函数创建一个临时的栈区域,用来保存在函数中产生的数据(形参也保存在这个里面)
当函数调用结束的时候系统会自动释放这内存(内存中的数据会被删除),只有返回值不会直接删除
示例:
def func1():
return 'abc'
print('abc'.upper(), func1().upper()) # ABC ABC
2.return
return在函数中有两个作用:
- 返回返回值 - 谁在return后面,谁就是返回值
- 提前结束函数 - 执行函数体的时候如果遇到return,函数会提前结束
示例:
def func1():
print('+++')
return 100
print('===')
print('---')
x = func1()
print(x)
函数的参数
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(y=10, x=20, z=30) # x:20,y:10,z:30
func1(10, z=30, y=20) # x:10,y:20,z:30
2.参数的默认值 - 形参
定义函数的时候,可以通过’形参=值’的方式给参数赋默认值;如果一个形参有默认值,那么在调用函数的时候这个形参可以不用赋值
注意:定义函数的时候如果有的参数有默认值,没有默认值的参数必须放在有默认值参数的前面
示例:
def func2(x, y, z=30):
print(f'x:{x},y:{y},z:{z}')
func2(10, 20) # x:10,y:20,z:30
func2(100, 200, 300) # x:100,y:200,z:300
3.参数类型说明 - 定义函数的时候指定参数类型
参数类型说明即可以提示使用者在调用函数的时候该传什么类型的数据,又可以让参数在函数体中使用的时候有代码提示
1)方法1-没有默认值的参数:形参:类型名
2)方法2:给参数赋默认值,默认值的类型就是参数的类型
示例:
def func3(str1: str):
return str1.upper()
print(func3('abc')) # ABC
# 补充变量类型说明
message = '["1","2","3"]'
list1 = eval(message) # type: list
list1.clear()
print(list1) # []
4.不定长参数
- 带 * 的不定长参数
定义函数的时候,如果在某个形参前面加*,那么这个参数就变成了一个不定长的参数,调用的时候这个形参可以接收若干个实参
本质:如果形参前面有*,那么这个参数就会自动变成一个元组,它接收到的所有的实参会作为这个元组的元素
注意:a.带的不定长参数在传参的时候只能使用位置参数
b.定长参数和带的不定长参数混用的时候,*前的定长参数必须用位置参数传参,*后面的定长参数必须用关键字参数传参 - 带 ** 的不定长参数(了解)
本质:如果形参前有**,那么这个参数就会自动变成一个字典,它接收到的所有的实参会作为这个字典的键值对
注意:传参的时候只能使用关键字参数传参
示例:
def func4(*num):
print(num)
func4(1,2,3,4,5) # (1, 2, 3, 4, 5)
def func5(x,*num):
print(x,num)
func5(20,10,3,5,7) # 20 (10, 3, 5, 7)
def func6(*num):
s = 0
for i in num:
s += i
return s
print(func6(1,2,3,4,5,6)) # 21
def func7(**x):
pass
func7()
func7(a=10)
func7(a=10,b=20,c=30)
-
编写一个函数,交换指定字典的key和value。
例如:dict1={'a':1, 'b':2, 'c':3} --> dict1={1:'a', 2:'b', 3:'c'} def trade(dict1:dict): dict2 = {x:y for y,x in dict1.items()} return dict2 dict1 = {'a':1,'b':2,'c':3} print(trade(dict1))
-
编写一个函数,提取指定字符串中所有的字母,然后拼接在一起产生一个新的字符串
例如: 传入'12a&bc12d-+' --> 'abcd' def func1(str1: str): str2 = ''.join([x for x in str1 if 'a' <= x <= 'z' or 'A' <= x <= 'Z']) return str2 x = '123asdaasd123dsad' print(func1(x))
-
写一个自己的capitalize函数,能够将指定字符串的首字母变成大写字母
例如: 'abc' -> 'Abc' '12asd' --> '12asd' def func2(str1:str): str2 = '' for i in range(len(str1)): if i == 0 and 'a' <= str1[i] <= 'z': str2 += chr(ord(str1[i])-32) else: str2 += str1[i] return str2 x = 'asd12312' print(func2(x))
-
写一个自己的endswith函数,判断一个字符串是否已指定的字符串结束
例如: 字符串1:'abc231ab' 字符串2:'ab' 函数结果为: True 字符串1:'abc231ab' 字符串2:'ab1' 函数结果为: False def func3(str1:str,str2:str): if str1[-1:-1-len(str2):-1] == str2[-1:-1-len(str2)-1:-1]: return True else: return False print(func3('sada123','a123'))
-
写一个自己的isdigit函数,判断一个字符串是否是纯数字字符串
例如: '1234921' 结果: True '23函数' 结果: False 'a2390' 结果: False def func4(str1:str): for i in str1: if not '1' <= i <= '9': return False else: return True print(func4('12222sa'))
-
写一个自己的upper函数,将一个字符串中所有的小写字母变成大写字母
例如: 'abH23好rp1' 结果: 'ABH23好RP1' def func5(str1:str): str2 = '' # type: str for i in str1: if 'a' <= i <= 'z': str2 += chr(ord(i) - 32) else: str2 += i return str2 print(func5('a6B5c3'))
-
写一个自己的rjust函数,创建一个字符串的长度是指定长度,原字符串在新字符串中右对齐,剩下的部分用指定的字符填充
例如: 原字符:'abc' 宽度: 7 字符:'^' 结果: '^^^^abc' 原字符:'你好吗' 宽度: 5 字符:'0' 结果: '00你好吗' def func6(str1:str,x:int,y): str2 = '' for i in range(1,x+1): str2 += str(y) str2 += str1 return str2 print(func6('123',7,0))
-
写一个自己的index函数,统计指定列表中指定元素的所有下标,如果列表中没有指定元素返回-1
例如: 列表: [1, 2, 45, 'abc', 1, '你好', 1, 0] 元素: 1 结果: 0,4,6 列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权'] 元素: '赵云' 结果: 0,4 列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权'] 元素: '关羽' 结果: -1 def func8(list1: list, x): list2 = [] # type:list for i in range(len(list1)): if list1[i] == x: list2.append(i) if list2 == []: return -1 return list2 list1 = [1, 2, 1, 1, 1] print(func8(list1, 1))
-
写一个自己的len函数,统计指定序列中元素的个数
例如: 序列:[1, 3, 5, 6] 结果: 4 序列:(1, 34, 'a', 45, 'bbb') 结果: 5 序列:'hello w' 结果: 7 def func7(x): s = 0 for i in x: s += 1 return s x = '123a' print(func7(x)) y = [1,2,3] print(func7(y)) z = (1,2,3) print(func7(z))
-
写一个自己的max函数,获取指定序列中元素的最大值。如果序列是字典,取字典值的最大值
例如: 序列:[-7, -12, -1, -9] 结果: -1 序列:'abcdpzasdz' 结果: 'z' 序列:{'小明':90, '张三': 76, '路飞':30, '小花': 98} 结果: 98 def func9(x): if type(x) == dict: list1 = [i for i in x.values()] s = list1[0] for m in list1: if m > s: s = m return s else: s = x[0] for i in x: if i > s: s = i return s print(func9([1,2,6,7,2,1])) print(func9({'小明':90, '张三': 76, '路飞':30, '小花': 98})) print(func9('abcdpzasdz'))
-
写一个函数实现自己in操作,判断指定序列中,指定的元素是否存在
例如: 序列: (12, 90, 'abc') 元素: '90' 结果: False 序列: [12, 90, 'abc'] 元素: 90 结果: True def func10(x,y): for i in x: if i == y: return True else: return False print(func10((12, 90, 'abc'),'90')) print(func10([12, 90, 'abc'],90))
-
写一个自己的replace函数,将指定字符串中指定的旧字符串转换成指定的新字符串
例如: 原字符串: 'how are you? and you?' 旧字符串: 'you' 新字符串:'me' 结果: 'how are me? and me?' def func11(x, y, z): return z.join(x.split(y)) print(func11('how are you? and you?', 'you', 'me'))
定义一个自己的update函数,将一个字典中所有的键值对添加到另外一个字典中
def func12(dict1:dict,dict2:dict):
x = list(dict1.items())
y = list(dict2.items())
z = x + y
new_dict = {i[0]:i[1] for i in z}
return new_dict
dict1 = {'1':1,'2':2}
dict2 = {'1':1,'3':3}
print(func12(dict1,dict2))