Day 7
推导式
-
列表推导式
语法1:
list = [expression for variable in sequence]
说明:
expression - 代表一个表达式
variable - 表示变量
sequence - 表示序列
产生一个新列表,列表中的元素就是每次循环对应的表达式的结果
等价于:
list = [] for variable in sequene: list.append(expression)
list1 = [1 for i in range(3)] print(list1) # [1, 1, 1] list2 = [2*x for x in range(5)] print(list2) # [0, 2, 4, 6, 8] # 练习1:写一个列表推导式,产生一个列表中的元素满足以下规律:str0,str3,str6,str9,...,str99 list3 = [f'str{y}' for y in range(0, 100, 3)] # list3 = ['str'+str(y) for y in range(0, 100, 3)] print(list3)
语法2:
list = [expression for variable in sequance if condition]
说明:
condition - 表示条件
等价于:
list = [] for variable in sequence: if conition: list.append(expression)
# 练习2:写一个列表推导式,产生一个列表中的元素满足以下规律:str1,str3,str6,str9,...,str99 list4 = [f'str{z}' for z in range(1, 100) if z == 1 or z % 3 == 0] # 三目运算符方法 list4 = ['str1' if z == 0 else f'str{z}' for z in range(0, 100, 3)] print(list4)
语法3:
list = [expression for variable1 in sequence1 for variable2 in sequence2]
list = [expression for variable1 in sequence1 for variable2 in sequence2 if condition]
list = [expression for variable1 in sequence1 if condition1 for variable2 in sequence2 if condition2]
等价于:
list =[] for variable1 in sequence1: if condition1: for variable2 in sequence2: if condition2: list.append(expression)
list5 = [f'{x}{y}' for x in range(3) for y in 'abc'] print(list5) # ['0a', '0b', '0c', '1a', '1b', '1c', '2a', '2b', '2c'] list6 = [f'{x}{y}' for x in range(20) if x & 1 for y in 'a25bc464899(^%%de' if 'a' <= y <= 'z'] print(list6) # ['1a', '1b', '1c', '1d', '1e', '3a', '3b', '3c', '3d', '3e', '5a', '5b', '5c', '5d', '5e', '7a', '7b', '7c', '7d', '7e', '9a', '9b', '9c', '9d', '9e', '11a', '11b', '11c', '11d', '11e', '13a', '13b', '13c', '13d', '13e', '15a', '15b', '15c', '15d', '15e', '17a', '17b', '17c', '17d', '17e', '19a', '19b', '19c', '19d', '19e']
-
集合推导式(将列表推导式的[]变为{})
set1 = {x*2 for x in 'hello'} print(set1) # {'ll', 'ee', 'oo', 'hh'}
-
元组推导式
语法:
tup = tuple(expression for variable in sequence)
tup1 = tuple(x*2 for x in 'hello') print(tup1) # ('hh', 'ee', 'll', 'll', 'oo')
-
字典推导式
语法:
dic1 = {expression for variable in sequence}
dic2 = dict(expression for variable in sequence)
说明:
如果序列是键值对形式存在直接把列表推导式的[]转换为{},即dic1
如果不是则用dic2
# 练习3:通过字典推导式交换一个字典的键和值 dic1 = {'a': 10, 'b': 20, 'c': 30} new_dic1 = {dic1[key]: key for key in dic1} print(new_dic1) # {10: 'a', 20: 'b', 30: 'c'} # 练习4:通过字典推导式交换一个字典的键和值,如果值是可变的在新的字典中不交换 dic2 = {'a': 10, 'b': 20, 'c': 30, 'd': [10, 20]} new_dic2 = dict((key, dic2[key]) if type(dic2[key]) == list or type(dic2[key]) == dict or type(dic2[key]) == set else (dic2[key], key) for key in dic2) new_dic2 = dict((key, dic2[key]) if type(dic2[key]) in (list, dict, set) else (dic2[key], key) for key in dic2) print(new_dic2) # {10: 'a', 20: 'b', 30: 'c', 'd': [10, 20]}
函数基础
没有函数时可能出现的问题:
1.相同功能对应的代码需要重新编写
2.一旦功能发生改变,需要将使用到这个功能的代码的位置全部修改
而函数可以简单的解决上述问题;因此,函数在编程中就显得至关重要了
-
函数定义
函数就是对实现某一特定功能的代码的封装
-
函数分类
从定义的角度分为:
1.系统函数:对Python来说就是已经定义好,可以直接使用的函数;例如:print、type、chr、ord、id、max等
2.自定义函数:由程序员自己定义,可以自己使用或给别人使用的函数
还有含参函数和不含餐函数等等分类
-
函数的使用
-
定义函数
语法:
def Function name(Parameter list): Function documentation Function body
说明:
1.def - 关键字;固定写法
2.Function name - 函数名:程序员自己命名;要求和规范同变量(标识符,不能是关键字;字母小写,单词用下划线隔开,见名知意(看到命名,得知功能),不使用系统的函数名、类型名和模块名)
3.():- 固定写法
4.Parameter list - 形参列表:以’variable1,variable2,variable3,……'的形式存在,每一个变量variable都是一个形参;用来将函数外部的数据传递到函数里面(如果实现函数的功能需要外部提供数据则需要形参)
5.Function documentation - 函数说明文档:函数功能的说明;本质就是“”“”“”注释(必须是双引号)
6.Function body - 函数体:与def保持一个缩进的一条或多条语句(至少一条),用来实现函数的功能
注意:
定义函数时不会执行函数体
# 示例1:定义一个函数求任意两个数的和 def summation(num1, num2): """ 求两个数的和 - 函数功能说明 :param num1:提供第一个数字 - 参数说明 :param num2:提供第二个数字 - 参数说明 :return:None - 返回值 """ print(num1 + num2) # 练习1:定义一个函数,求阶乘 def factorial(num): """ 求数的阶乘 :param num:提供数字 :return:None """ fac_num = 1 for i in range(1, num + 1): fac_num *= i print(fac_num) # 练习2:将两个字符串交叉合并 def merge(str1, str2): """ 交叉合并两个字符串 :param str1:提供第一个字符串 :param str2:提供第二个字符串 :return:None """ merge_str = '' str1_length = len(str1) str2_length = len(str2) # 交叉拼接相同长度的部分 for i in range(min(str1_length, str2_length)): merge_str = merge_str + str1[i] + str2[i] # 确定尾部 if str1_length <= str2_length: merge_str = merge_str + str2[str1_length:] else: merge_str = merge_str + str1[str2_length:] print(merge_str)
-
调用函数
语法:
Function name(List of arguments)
说明:
1.Function name - 需要使用的已经定义好的函数名
2.()- 固定写法
3.List of arguments - 实参列表:以’value1,value2,value3,……'的形式存在;实参就是需要从函数外部传递到函数内使用的具体数据(默认情况下形参有多少就有多少实参)
factorial(5) merge('asdakfj', '12784')
-
-
函数的参数
根据实参的传递方式分为位置参数和关键字参数,其中,当两者混用时要保证位置参数在关键字参数前面
-
位置参数
语法:
value1,value2,value3,……
说明:
让实参和形参一一对应
def func1(a, b, c): print(f'a:{a}, b:{b}, c:{c}') func1(1, 2, 3) # a:1, b:2, c:3
-
关键字参数
语法:
Formal parameters1=Arguments1,Formal parameters2=Arguments2,……
说明:
可以打乱顺序
def func1(a, b, c): print(f'a:{a}, b:{b}, c:{c}') func1(a=1, c=3, b=2) # a:1, b:2, c:3
-
另外说明 - 不定长参数
定义参数时参数个数不确定,使用不定长参数
a.带*的不定长参数 - 在形参前加使其变为不定长参数,可以同时接受多个实参;这个参数本质是一个元组,传递的实参会转换为这个元组中的元素
b.带**的不定长参数 - 在形参前加使其变为不定长参数,可以同时接受多个实参;本质是一个字典(必须使用关键字参数传参)
def func_a1(*num1): print(num1) func_a1() # () func_a1(1) # (1,) func_a1(1, 2) # (1, 2) func_a1(1, 2, 3, 4, 5, 6) # (1, 2, 3, 4, 5, 6) def func_a2(*num2, a1): print(num2, 'a1:', a1) func_a2(a1=1) # () a1: 1 func_a2(2, 3, 4, 5, a1=1) # (2, 3, 4, 5) a1: 1 def func_a3(a2, *num3): print(num3, 'a2:', a2) func_a3(a2=1) # () a2: 1 func_a3(1, 2, 3, 4, 5) # (2, 3, 4, 5) a2: 1
-
注意:
func(*args, **kwargs) 中*args, **kwargs的意义是让函数在调用时类型和数量更灵活,既可以不传参,也可以用位置参数,关键字参数,也可以混用
-
-
默认参数值
定义函数时可以直接给一个或多个形参赋默认值;有默认值的参数在调用时可以选择不传参
没有默认值的参数必须在有默认值的参数前面
def func2(b, a=2, c=3): print(f'a:{a}, b:{b}, c:{c}') def func3(b, a, c=3): print(f'a:{a}, b:{b}, c:{c}') func2(b=5) # a:2, b:5, c:3 func3(4,2) # a:2, b:4, c:3