python-函数
函数
1、函数定义
## 定义函数 def test(x): # 说明函数功能 x += 1 return x ## 调用函数 print(test(4))
def test(): pass print(test) ### 输出函数名 内存地址:<function test at 0x00D91108>
2、返回值
—过程:没有返回值(return)的函数
— python 中 没有return,默认返回 None
— 返回值>1 ,返回一个tuple(元祖)
3、函数参数
— 形参 实参
— 一个参数不能传两遍值
— 位置参数一一对应,不多不少
—关键字参数,无需一一对应,不多不少
def test(x,y,z): print(x) print(y) print(z) test(z=1,y=4,x=4)
— 位置参数必须在关键字参数的左边
— 默认参数
def test(x,y='gogo'): print(x,y) test(1) ### y为默认参数 1 gogo test(4,'not') ### 传参覆盖y的默认值, 4 not
— 参数组
*列表
def text(x,*args): print(x,args,args[4]) text(3,4,656,76,43,5,4) ## 3 (4, 656, 76, 43, 5, 4) 5 text(3,*['d',2,'f']) ## 3 ('d', 2, 'f')
**字典
def test(x,**kwargs): print(x,kwargs) test(4,y='fd',z='ew') ### 4 {'y': 'fd', 'z': 'ew'}
def test(x,*args,**kwargs): print(x,args,kwargs) test(4,'sdad',4,5,6,y='fd',z='ew') ### 4 ('sdad', 4, 5, 6) {'y': 'fd', 'z': 'ew'}
4、全局变量,局部变量
— 全局变量名大写
— 局部变量名小写
name = '全局' def change_name(): name = '局部' print('change_name', name) change_name() ### change_name 局部 print(name) ### 全局
name = '全局' def change_name(): global name name = '局部' print('change_name', name) change_name() ## change_name 局部 print(name) ### 局部
name = ['全局','变量'] def change_name(): name.append('可操作') print('change_name', name) change_name() ### change_name ['全局', '变量', '可操作'] print(name) ### ['全局', '变量', '可操作']
5、函数嵌套
### 函数可嵌套,函数若不调用,不执行 def first(): name = '第一层' print (name) def second(): name = '第二层' print(name) second() print(name) first() ### 第一层 ### 第二层
name = '全局' def first(): name = '局部' def second(): global name name = '改变' second() print(name) print(name) first() print(name) ### 全局 ### 局部 ### 改变
6、递归
— 函数内部调用自身
— 有明确结束条件(死循环会报错)
import time def calc(n): print(n) time.sleep(1) ## 停顿1s calc(n) calc(10)
def cal(n): print(n) if int(n/2) == 0: return n return cal(int(n/2)) cal(10) ### 10 5 2 1
7、作用域
def test1(): print('test1') def test(): print('test') return test1 ## return可以返回任何值 res = test() ### 执行test(),返回函数名 test1 print(res) ### 打印函数名(即函数的内存地址)<function test1 at 0x00A31108> print(res()) ### 执行test1() ,并将返回值打印,默认为None
name = '全局' def first(): name = '第一层' def second(): name = '第二层' def third(): print(name) return third return second first()()() #### 第二层
8、匿名函数
def calc(x): return x+1 print(calc(12)) ### 可以表示为匿名函数的形式 ### x是形参 : 操作并return出来 lambda x:x+1 ### 类似于函数名,是内存地址 ### 运行匿名函数 func = lambda x:x+1 print(func(10)) ### 11
9、高阶函数
(1)函数接收的参数是一个函数名
(2)返回资中包含函数
10、map函数
map(func(函数功能),array(可迭代对象)):处理序列中的每个元素,得到的结果是一个‘列表’,该‘列表’元素的个数及位置与原来相同
num = [1, 2, 3, 4, 5, 6] def map_test(func, array): ret = [] for i in num: res = func(i) ret.append(res) return ret print (map_test(lambda x: x + 1,num)) ###[2, 3, 4, 5, 6, 7] ### 用map 函数实现 s = map(lambda x:x**2,num) print(list(s)) ### [1, 4, 9, 16, 25, 36]
11、filter 函数(过滤)
filter(func(函数功能),array(可迭代对象)):遍历序列中每一个元素,判断元素是否满足条件得到布尔值,如果是True则保留
member = ['gogo','baba','kaka'] def filter_test(func,array): ret = [] for p in member: if not func(p): ret.append(p) return ret res = filter_test(lambda n:str(n).endswith('a'),member) print(res) ### ['gogo'] ### 用filter 函数实现 print(list(filter(lambda n:not str(n).endswith('a'),member)))
12、reduce函数
filter(func(函数功能),array(可迭代对象),initial(初始值)):处理一个序列,对序列进行合并操作
### 列表元素相乘,设置初始值init num = [1,2,3,4,5] def reduce_test(func,array,init=None): if init is None: res = array.pop(0) else: res = init for num in array: res = func(res,num) return res print (reduce_test(lambda x,y:x*y,num,10)) ### reduce函数 from functools import reduce print(reduce(lambda x,y:x*y,num,10))
13、内置函数
### 内置函数 ## 1、abs() 取负数 print(abs(-3)) ## 3 ## 2、all() 取所有元素做布尔运算 ## False: 0 ' ' None [] ## 可迭代对象为空,返回True print(all([1,2,'re',0])) ## 3、any() 任意为真则为真 print(any([1,0,''])) ## 4、bin() 十进制转二进制 ## hex() 十进制转十六进制 ## oct() 十进制转八进制 print(bin(3)) ## 5、bool() 布尔运算 False:空,None,0 print(bool(1)) ## 6、bytes() 字节 name = '好' print(bytes(name,encoding='utf-8')) ## b'\xe5\xa5\xbd' 3字节一个汉字 print(bytes(name,encoding='utf-8').decode('utf-8')) print(bytes(name,encoding='gbk')) ## b'\xba\xc3' 2字节一个汉字 print(bytes(name,encoding='gbk').decode('gbk')) #print(bytes(name,encoding='ascii')) ## ascii码不能编码汉字 ## 7、divmod() 商,余数 print(divmod(10,3)) ## (3, 1) ## 8、eval() ## 把字符串中的数据结构提取出来 ## 把字符串中的数学运算进行运算 print(eval('2+3+4')) ## 9、hash() ## 可hash的数据类型,即不可变数据类型 ## 判断是否被修改 name = 'hh' print('before',hash(name)) ## before -1094276877 name = 'kk' print('after',hash(name)) ## after 210196591 ## 10、isinstance() print(isinstance(4,int)) ## 判断类型 ## 11、globals() 打印全局变量 print(globals()) ## locals() 打印局部变量 print(locals()) ## 12、 zip() 拉链 传序列 一一对应,多余舍去 ## 序列:列表、元祖、字符串 print(list(zip(('a','s','d'),(1,2,3)))) ##[('a', 1), ('s', 2), ('d', 3)] dic = {'name':'Amy','age':19,'gender':'female'} print(list(zip(dic.keys(),dic.values()))) ## [('name', 'Amy'), ('age', 19), ('gender', 'female')] print(list(zip('hello','123'))) ## [('h', '1'), ('e', '2'), ('l', '3')]
min() max()
— 处理对象是可迭代类型,相当于循环每一个元素进行比较
— 不同类型元素无法比较
— 每个元素进行比较,是从元素第一个位置开始比较,如果这个位置比较出大小,后面位置可不用比较,直接得出大小
## 13、 max() min() 最大最小值 ## 不同类型不能进行比较 li = [1,2,3,45,6] print(max(li)) ### 字典中的最值 age_dic = {'age1':12,'age4':13,'age3':16} print(max(age_dic)) ### 默认比较key age4 print(max(age_dic.values())) ### 比较value 16 zip(age_dic.values(),age_dic.keys()) ## key 和 value 调换 print(max(zip(age_dic.values(),age_dic.keys()))) ## (16, 'age3') people = [ {'name':'Amy','age':45}, {'name': 'Bob', 'age': 34}, {'name': 'Lisa', 'age': 23}, {'name': 'Lucy', 'age': 26}, ] print(max(people,key=lambda dic:dic['age'])) ## {'name': 'Amy', 'age': 45}
## 14、 chr() 打印ASCII码表中位置 ## ord() 与上面相反 ## 15、pow() print(pow(3,3)) ## 3**3 print(pow(3,3,2)) ## 3**3%2 ## 16、reversed() 反转 print(list(reversed([1,2,3,4]))) ### [4, 3, 2, 1] ## 17、round() 四舍五入 print(round(8.7)) ## 9 ## 18、slice() 切片 s = 'hello' s1 = slice(3,5) print(s[s1]) ## lo
## 19、sorted() 排序 li = [3,5,1,4,1,3] print (sorted((li))) ## [1, 1, 3, 3, 4, 5] ## 列表排序 people = [ {'name':'Amy','age':45}, {'name': 'Bob', 'age': 34}, {'name': 'Lisa', 'age': 23}, {'name': 'Lucy', 'age': 26}, ] print(sorted(people,key=lambda dic:dic['age'])) ## 字典排序 name_dic = { 'Amy':99, 'Haha':78, 'Kaka':90 } print(sorted(name_dic)) ### 默认根据key排序 print(sorted(name_dic,key=lambda key:name_dic[key])) ### ['Haha', 'Kaka', 'Amy'] print(sorted(zip(name_dic.values(),name_dic.keys()))) ## [(78, 'Haha'), (90, 'Kaka'), (99, 'Amy')]
## 20、sum() 求和 print(sum(range(5))) ## 10 ## 21、 type() 数据类型 print(type('we')) ## <class 'str'> ## 22、 vars() def test(): ## 打印 {'msg': 'hello hello hi'} msg = 'hello hello hi' print(locals()) print(vars()) test() ## 23、import 不能导入字符串模块名 ## __import__() 导入字符串模块名