一、函数
可以完成特定功能的代码块,函数就是存放代码块的容器
1、定义函数的语法:
函数四部分:(函数执行的本质:执行函数体,得到函数返回值)
①函数名 ②函数体 ③返回值 ④参数
# 用def关键词来声明函数 def 函数名(参数们) 函数体 return返回值 def fn(money): print('你付了%s元钱' % money) print('函数的一行代码') print('函数的二行代码') return '冰红茶' print(fn, id(fn)) # fn直接打印,只能看到函数存放代码的地址 fn(10) msg = fn(10) print(msg) # 函数的返回值也称之为函数值,就是函数执行结束后的结果 # 可以用变量接受 | 可以直接打印 | 可以直接使用
2、如何使用函数(函数一定要先定义在调用)
函数名:拿到函数的地址
函数名():拿到函数的地址,并执行函数中存放的代码块(函数体)
函数名(参数):执行函数并传入参数
函数名():执行完毕后,会得到函数的返回值,返回值就跟普通变量一样,可以直接打印、使用、运算
def fn(num): print("传入的num值:%s" % num) return '收到了' res = fn(10) # 控制台会打印:传入的num值:10 # res的值为:'收到了'
3、函数的分类
①按函数体进行分类
# 空函数:项目之初,知道项目有哪些功能,但还没有明确功能体,可以用pass进行函数体填充 def computed(): pass
# 非空函数:有函数体 def add(n1, n2): return n1 + n2 res = add(10, 20) # 结果为 30 print(res)
②按参数列表进行分类
# 无参函数:函数体运行不需要外界提供参数 def msg(): print('hello') msg() # 有参函数:函数体运行需要外界提供参数 def msg(p1, p2): print('欢迎%s和%s' % (p1, p2)) p1 = input('输入一号领导名:') p2 = input('输入二号领导名:') msg(p1, p2)
③按返回值进行分类:return是用来结束函数的
# 空返回 没有return的函数 空return # 值返回 return一个值 return多个值 # 空返回 def fn1(): print('fn1 run') def fn2(): print('fn2 run') return return None res = fn2() # 无return函数与空return函数的区别 # 空return:可以根据具体情况主动退出函数(像break结束循环一样) # 值返回 # 一个值的返回 def add(n1, n2): return n1 + n2 print(add(10, 15)) def computed(n1, n2): # 返回四则运算的结果 r1 = n1 + n2 r2 = n1 - n2 r3 = n1 / n2 r4 = n1 * n2 return [r1, r2, r3, r4] a, b, c, d = computed(50, 25) print(a, b, c, d) # 多个值的返回: 本质就是返回装有多个值的元组 def computed(n1, n2): # 返回四则运算的结果 r1 = n1 + n2 r2 = n1 - n2 r3 = n1 // n2 r4 = n1 ** n2 return r1, r2, r3, r4 a, b, c, d = computed(50, 25) print(a, b, c, d) res = computed(50, 25) # 得到的是装有所有结果的元组 print(res)
4、函数的嵌套调用
①定义:在一个函数内调用另一个函数。在解释过程中,不执行函数体,在函数被调用时,函数体才被执行
def fn1():
print('fn1 run')
fn2()
def fn2():
print('fn2 run')
fn3()
def fn3():
print('fn3 run')
# 注:在fn1中调用了fn2,所以调用fn1的逻辑应该在fn2定义之后
fn1()
②案例
# 案例:用函数实现获取两个数的最大值 def max_2(n1, n2): if n1 > n2: return n1 return n2 print(max_2(200, 30)) # 获取三个数的最大值 def max_3(n1, n2, n3): if n1 > n2 and n1 > n3: return n1 if n2 > n1 and n2 > n3: return n2 return n3 def max_3(n1, n2, n3): m2 = max_2(n1, n2) return max_2(m2, n3) print(max_3(300, 30, 30)) # 四个数 def max_4(n1, n2, n3, n4): m2 = max_2(n1, n2) return max_3(m2, n3, n4) print(max_4(10,30,20,0))
5、指定文件名的文件复制
def copy_file(source, target): with open(source, 'rb') as r, open(target, 'wb') as w: for line in r: w.write(line) copy_file('cmd.txt', 'aaa.txt') copy_file('temp.txt', 'ttt.txt')
6、偏函数:先给函数传一个值进去
from functools import partial def test(x, y, z): return x + y + z test = partial(test, 1) print(test(2, 3)) # 6
二、例子
1、定义一个函数,该函数可以实现控制台输入,最终返回一个int类型的正整数
def fn1(): while True: num = input("num: ") if num.isdigit(): return int(num) res = fn1() print(res)
2、定义一个函数,该函数可以实现用户录入,最终返回一个int类型的负整数
def fn2(): while True: num = input("num: ") b1 = num.startswith('-') b2 = num.count('-') == 1 if b1 and b2 and num.split('-')[1].isdigit(): # and短路 return int(num) res = fn2() print(res)
3、定义一个函数,实现传入一个数或是字符串,返回值是 是否 是可转换为整数类型的数据
def fn3(num): if isinstance(num, (int, float)): return True elif isinstance(num, str): b1 = num.startswith('-') b2 = num.count('-') == 1 if b1 and b2 and num.split('-')[1].isdigit(): return True elif num.isdigit(): return True return False print(fn3('-3'))
4、定义一个函数,实现传入一个整型数字,判断并直接打印该数字是否是奇数还是偶数
def fn4(num): if num % 2 == 0: print('偶数') else: print('奇数') print(fn4(10))
5、定义一个函数,实现判断传入数据的类型,并直接打印其类型
def fn5(any_arg): if isinstance(any_arg, bool): print('布尔') return if isinstance(any_arg, int): print('整型') fn5(True)
6、定义一个函数,只要传入 "k1:v1,...,kn:vn" 格式的字符串,都可以将其转换为 {'k1':'v1',...,'kn':'vn'}
def fn7(string): dic = {} k_v_s = string.split(',') for k_v in k_v_s: k, v = k_v.split(':') dic[k] = v return dic print(fn7('k1:v1,k2:v2,kn:vn'))
7、定义一个函数,实现列表与元组类型的反转功能
def fn8(arg): if isinstance(arg, tuple): return list(arg) return tuple(arg) print(fn8([1, 2]))
8、定义一个函数,可以完成对list、tuple、dict、set四种类型数据的循环变量打印, 不是这四种,则打印 "暂不支持该数据遍历"
def fn9(arg): if isinstance(arg, (list, tuple, dict, set)): for v in arg: print(v) else: print("暂不支持该数据遍历") fn9({'a': 1})
9、定义一个函数,实现对单列集合进行去重的功能 # 解析:单列集合有list、tuple、set
传入list、tuple、set,返回去重后的list、tuple、set,考虑可变与不可变类型的不同处理
def fn10(arg): if isinstance(arg, set): # set直接返回 return arg temp_list = [] # 去重列表 for v in arg: if v not in temp_list: temp_list.append(v) if isinstance(arg, tuple): # tuple就转换后返回 return tuple(temp_list) return temp_list # 就只剩list了
10、定义一个函数,实现文件(不一定是文本文件)的跨文件夹的剪切
解析:1.传入要读取的目标文件夹中的目标文件
2.在被告知的目标文件夹下复制成同名文件
3.调用os中删除文件的功能将原文件删除
import os def fn11(file, folder): with open(file, 'rb') as r: # 文件名 file_name = r.name path = r'%s\%s' % (folder, file_name) with open(path, 'wb') as w: for line in r: w.write(line) os.remove(file) fn11('temp.txt', 'abc')