Learning Diary for Python - 10
一、函数
1.什么是函数
函数就是实现某一特定功能的代码的封装
2.函数分类
按照函数由谁创建的进行分类
-
系统函数 - python环境中已创建的函数
-
自定义函数 - 由程序员自己创建的函数
3.语法及说明
语法:
def 函数名(形参列表)
函数说明文档
函数体
说明 | 释义 |
---|---|
def | 关键字;固定写法 |
函数名 | 由程序员自己命名:(1)要求为标识符且不为关键字(2)不能和系统函数重名(3)字母均为小写;多个单词下划线隔开 |
() | 固定写法 |
形参列表 | 以变量1,变量2,变量3…形式存在,每一个变量为一个形参(可以没有);定义函数时形参个数由实现功能需要的额外数据 |
函数说明文档 | 多行注释;用来对函数的功能、参数和返回值进行说明(需保持缩进) |
函数体 | 一条或者多条语句(需保持缩进) |
4.调用函数
-
重要结论:定义函数的时候不会执行函数,
-
语法:函数名(实参列表)
-
说明
名称 释义 函数名 需要那个函数功能就调用哪个函数(必须为已定义的函数名) () 固定写法 实参列表 实参就是真正通过形参传递到函数内部的数据 -
函数调用过程
- 当代码执行到函数调用语句时:
- 回到函数定义的位置
- 传参(用实参给形参赋值)必须保证每个形参都有值
- 执行函数体
- 确定返回值
- 回到函数调用的位置
- 当代码执行到函数调用语句时:
5.函数的参数
-
位置参数和关键字参数 - 根据实参的传递方式不同,将函数的实参分为两种
-
位置参数
调用函数的时候直接将多个数据用逗号隔开, 实参和形参从位置上一页对应
-
关键字参数
调用函数的时候,在实参前面加’形参名=’,实参和形参由关键字对应
-
两种参数混合使用
要求位置参数必须在关键字参数前
-
-
参数默认值
定义函数的时候,可以给形参赋默认值,调用函数的时候已经有默认值的参数可以不用传参。
如果给部分参数赋默认值,必须保证没有默认值的参数在有默认值的参数的前面。
-
参数类型说明:定义函数的时候,指定参数类型
#无默认值参数添加类型说明 #参数后面接:和类型 def function(list:int,str:str,z:float): #默认值参数添加类型说明 #默认值的类型就是参数的类型
4.不定长参数
在形参前面加*,那么参数就变成一个元组,用来接收对应的所有实参(实参是元组中的元素)
如果函数参数在带*后面,后面的参数在调用时必须使用关键字参数
6.函数的返回值
- 意义:返回值就是从函数内部传递到函数外部的数据
- 怎么确定函数返回值:将需要的数据放在return后面
- 怎么获得函数返回值:在函数外部获取函数调用表达式的结果
- 什么时候需要返回值:如果实现函数的功能产生了新的数据,将新的数据作为返回值返回
二、练习
-
编写一个函数,交换指定字典的key和value。
例如:dict1={'a':1, 'b':2, 'c':3} --> dict1={1:'a', 2:'b', 3:'c'}
def exchange(x): dict1 = {value: key for key, value in x.items()} print(dict1) dict={'a':1, 'b':2, 'c':3} exchange(dict)
-
编写一个函数,提取指定字符串中所有的字母,然后拼接在一起产生一个新的字符串
例如: 传入'12a&bc12d-+' --> 'abcd'
def str_new(x): list = [i for i in x if 'a' <= i <= 'z'] print(''.join(x)) str='12a&bc12d-+' str_new(str)
-
写一个自己的capitalize函数,能够将指定字符串的首字母变成大写字母
例如: 'abc' -> 'Abc' '12asd' --> '12asd'
def cap1(x): a = x[0] if 'a' <= a <= 'z': a = chr(ord(a) - 32) print(a + x[1:]) cap1(str)
-
写一个自己的endswith函数,判断一个字符串是否已指定的字符串结束
例如: 字符串1:'abc231ab' 字符串2:'ab' 函数结果为: True 字符串1:'abc231ab' 字符串2:'ab1' 函数结果为: False
def endswith1(x,y): print((x[-1:-1 - len(y):-1] == y[-1:-1 - len(y):-1])) str1='abc231ab' str2='ab1' endswith1(str1,str2)
-
写一个自己的isdigit函数,判断一个字符串是否是纯数字字符串
例如: '1234921' 结果: True '23函数' 结果: False 'a2390' 结果: False
def isdigit1(x): for i in x: if not '0' <= i <= '9': print(1 == 0) break else: print(0 == 0) str1='1234a921' isdigit1(str1)
-
写一个自己的upper函数,将一个字符串中所有的小写字母变成大写字母
例如: 'abH23好rp1' 结果: 'ABH23好RP1'
def upper1(x): str= '' for i in x: if 'a' <= i <= 'z': a = chr(ord(i) - 32) str += a else: str+= i print(str) str1='abH23好rp1' upper1(str1)
-
写一个自己的rjust函数,创建一个字符串的长度是指定长度,原字符串在新字符串中右对齐,剩下的部分用指定的字符填充
例如: 原字符:'abc' 宽度: 7 字符:'^' 结果: '^^^^abc' 原字符:'你好吗' 宽度: 5 字符:'0' 结果: '00你好吗'
def rjust1(x,y,z): str='' while len(str)+len(x)<y: str+=z else: str+=x print(str) rjust1('你好吗',5,'0')
-
写一个自己的index函数,统计指定列表中指定元素的所有下标,如果列表中没有指定元素返回-1
例如: 列表: [1, 2, 45, 'abc', 1, '你好', 1, 0] 元素: 1 结果: 0,4,6 列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权'] 元素: '赵云' 结果: 0,4 列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权'] 元素: '关羽' 结果: -1
def index1(x,y): str1='' n=0 for i in range(len(x)): if x[i]==y: str1+=str(i) n+=1 if n==0: print('-1') else: print(','.join(str1))
-
写一个自己的len函数,统计指定序列中元素的个数
例如: 序列:[1, 3, 5, 6] 结果: 4 序列:(1, 34, 'a', 45, 'bbb') 结果: 5 序列:'hello w' 结果: 7
def len1(x): n=0 for i in x: n+=1 print(n) len1('hello w')
-
写一个自己的max函数,获取指定序列中元素的最大值。如果序列是字典,取字典值的最大值
例如: 序列:[-7, -12, -1, -9] 结果: -1 序列:'abcdpzasdz' 结果: 'z' 序列:{'小明':90, '张三': 76, '路飞':30, '小花': 98} 结果: 98
def max1(x): if type(x)!=dict: num=x[0] for i in x: if i<=num: continue else: num=i print(num) else: list1 = list(z.values()) num = list1[0] for i in list1: if i <= num: continue else: num = i print(num) z={'小明':90, '张三': 76, '路飞':30, '小花': 98} max1(z)
-
写一个函数实现自己in操作,判断指定序列中,指定的元素是否存在
例如: 序列: (12, 90, 'abc') 元素: '90' 结果: False 序列: [12, 90, 'abc'] 元素: 90 结果: True
def in1(x,y): n=0 for i in x: if i==y: n+=1 else: pass print(bool(n)) x=[12, 90, 'abc'] y=90 in1(x,y)
-
写一个自己的replace函数,将指定字符串中指定的旧字符串转换成指定的新字符串
例如: 原字符串: 'how are you? and you?' 旧字符串: 'you' 新字符串:'me' 结果: 'how are me? and me?'
def replace1(x,y,z): str1=x.split(y) str2=z.join(str1) print(str2) x='how are you? and you?' y='you' z='me' replace1(x,y,z)