当前位置: 代码迷 >> 综合 >> day9 - 推导式笔记
  详细解决方案

day9 - 推导式笔记

热度:76   发布时间:2024-02-26 22:17:21.0

推导式

''' 1)基本结构 列表 = [表达式 for 变量 in 序列]产生一个新的列表,列表中的元素就是每次循环对应的表达式的结果先当于: 列表 = [] for 变量 in 序列:列表.append(表达式)'''list1 = [10 for x in range(3)]
print(list1) # [10, 10, 10]list2 = [2*x for x in range(1, 4)]
print(list2) # [2, 4, 6]# 练习1: 写一个列表推导式,产生一个列表中的元素满足以下规律:str0,,str3,str6,str9,...,str99list3 = [f'str{x}' for x in range(0, 100, 3)]
print(list3)""" 2) 条件结构 列表 = [表达式 for 变量 in 序列 if 条件语句]相当于: 列表 = [] for 变量 in 序列:if 条件语句: """
list4 = [x for x in range(10) if x % 2]
print(list4) # [1, 3, 5, 7, 9]list5 = [x for x in range(10) if x % 2 == 0]
print(list5)   # [0, 2, 4, 6, 8]# 练习2 :写一个列表推导式,产生一个列表中的元素满足以下规律:str1,str3,str6,str9,...,str99# 方法一:
list6 = [f'str{x}' for x in range(1, 100) if x ==1 or x%3 == 0]
print(list6)# 方法二:
list7 = ['str1' if x == 0 elsse f'str{x}' for x in range (0, 100, 3)]""" (了解) 多重循环结构1: 列表 = [表达式 for 变量1 in 序列1 for 变量2 in 序列2]相当于: 列表 = [] for 变量1 in 序列1:for 变量2 in 序列2:列表.append(表达式)多重循环结构2: 列表 = [表达式 for 变量1 in 序列1 for 变量2 in 序列2 if 条件语句] 列表 = [] for 变量1 in 序列1:for 变量2 in 序列2:if 条件语句:列表.append(表达式) """
list8 = [f'{x}{y}' for x in range(3) for y in "abc"]
print(list8)  # ['0a', '0b', '0c', '1a', '1b', '1c', '2a', '2b', '2c']# 2.集合推导式
# 将列表推导式的[]变成{}
a1 = {
    x for x in "hello"}
print(a1)  # {'o', 'e', 'l', 'h'}# 3.元组和集合推导式
# 元组 - 将列表推导式的[]变成tuple()
# 字典 - (表达式时键值对形式)将列表推导式的[]变成{};(表达式时有且只有两个元素的序列的时候)将列表推导式的[]变成dict()
a2 = tuple(x*2 for x in "hello")
print(a2) # ('hh', 'ee', 'll', 'll', 'oo')a3 = {
    x: x*2 for x in 'hello'}
print(a3)  # {'h': 'hh', 'e': 'ee', 'l': 'll', 'o': 'oo'}a4 = dict((x, x*2) for x in 'hello')
print(a4)  # {'h': 'hh', 'e': 'ee', 'l': 'll', 'o': 'oo'}# 练习3:通过字典推导式交换一个字典的键和值
# dic = {'a': 10, "b": 20, 'c':30}-> {10: 'a', 20:'b', 30: 'c'}
dic = {
    'a': 10, 'b': 20, 'c': 30}
dic1 = {
    dic[key]: key for key in dic}
print(dic1)   # {10: 'a', 20: 'b', 30: 'c'}

函数基础

1. 认识函数
# 1. 认识函数
''' a. 什么是函数 函数就是对实现某一特定功能的代码的封装. b. 函数的分类(谁定义的函数)系统函数:python已经定义号,程序员可以直接使用的函数,列如print、input、type、chr、ord、id、max、min、sum、sored等,(别人已经造号的机器)自定义函数:由程序员自己定义, 程序员可以自己使用或者给别人使用的函数.(自己造机器)'''# 2.定义函数(造机器)
''' 语法: def 函数名(形参列表):函数说明文档函数体说明: 1) def - 关键字:固定写法 2)函数名 - 程序员自己命名要求:标识符 不能是关键字规范:字母小写,单词直接用下划线隔开;见名知义(看到函数大概知道函数功能);不适用系统的函数名, 类型名和模块名3)(): - 固定写法(不能省略)4)形参列表 - 以'变量名1, 变量名2, 变量名3....' 的形式存在形参的作用是将函数外部的数据传递到函数里面(如果实现函数的功能需要提供外部数据,那么这个函数就需要形参) 5) 函数说明文档 - 函数的说明书;本质就是""""引起来的注释6) 函数体 - 和 def保持一个缩进的一条或者多条语句(至少一条):实现函数功能的代码段重点 注意: 定义函数的时候不会执行函数体'''
# 示例1:定义一个函数求任意两个数字的和
num1 = 2
num2 = 3def sum1(num1, num2):"""求两个数字的和 - (函数功能说明区):param num1: 提供第一个数字 - (参数说明):param num2: 提供第二个数字 - (参数说明):return: None - (返回值说明)"""print(num1 + num2)sum1(5, 6)# 练习1:定义一个函数,求一个数的阶层: n! = 1*2*3*...*N
def sum2(m1):"""求一个数的阶乘:param m1: 输入函数:return:"""for x in range(1, m1):m1 *= xprint(m1)sum2(5)# 练习2:写一个函数将两个字符串交叉合并
# 'abc'、'123' -> a1b2c3
# 'abc'、'12345' -> a1b2c345
# 'abcdef'、'1234' -> a1b2c3d4ef
def marge(str1, str2):len1 = len(str1)len2 = len(str2)# 先交叉拼接相同长度的部分new_str = ''for index in range(min(len1, len2)):new_str += str1[index] + str2[index]# 再确定尾部if len1 > len2:new_str += str1[len2:]else:new_str += str2[len1:]print(new_str)# merge('abc', '123567')# 3.调用函数(使用机器)
sum1(90, 10)
# 同一个函数可以调用多次
sum1(11.1, 22.2)
factorial(5)    # 5的阶乘是:120
factorial(10)   # 10的阶乘是:3628800

函数的参数

# 1. 位置参数和关键字参数
# 根据实参的传递方式将实参分为位置参数和关键字参数两种
""" 1) 位置参数 以 '实参1,实参2,实参3,...' 形式存在,让实参和形参一一对应2) 关键字参数 以'形参1=实参1,形参2=实参2,...'形式存在,这个参数的位置可以随意更改3)位置参数和关键字参数混用 位置参数必须在关键字参数的前面 """def func(a, b, c):print(f'a:{a}, b:{b}, c:{c}')# 位置参数
func1(10, 20, 30) # a:10, b:20, c:30
func1(30, 20, 10) # a:30, b:20, c:10# 关键字参数
func1(a= 100, b=200, c=300) # a:100, b:200, c:300
func1(b=200, c=300, a=100)  # a:100, b:200, c:300# 混用
func1(10, 20, c=30)    # a:10, b:20, c:30
func1(100, c=230, b=220)    # a:100, b:220, c:230# 2.参数默认值
""" 定义函数的时候可以直接给一个或者多个形参赋默认值;有默认值的参数在调用的时候可以不传参 """def func2(a=1, b=2, c=3):print(f'a:{a}, b:{b}, c:{c}')func2()   # a:1, b:2, c:3
func2(10, 20)   # a:10, b:20, c:3
func2(b=200)    # a:1, b:200, c:3def func3(a, b, c=3):print(f'a:{a}, b:{b}, c:{c}')func3(100, 200)   # a:100, b:200, c:3
func3(100, 200, 300)   # a:100, b:200, c:300# 有默认值的参数必须在没有默认值参数的后面
def func4(a, c, b=200):print(f'a:{a}, b:{b}, c:{c}')func4(1, 3)    # a:1, b:200, c:3# 3.不定长参数
""" 定义函数的时候如果参数个数不确定,可以使用不定长参数1) 带*的不定长参数 在刑参前加*让这个形参变成不定长参数,可以同时接受多个实参。这个参数的本质就是一个元组,传递的对应的实参全部会变成这个元组的元素。(必须使用位置参数传参)2)带**的不定长参数 在形参前加**让这个形参变成不定长参数,可以同时接受多个实参。这个参数的本质就是一个字典(必须使用关键字参数传参,关键字自己随意命名) """# 定义一个函数,求多个数的平均值
def mean(*num):if len(num) == 0:print('0')else:print(sum(num)/len(num))mean()
mean(10)
mean(20, 12)
mean(20, 12, 23, 23, 432, 121, 90)def func5(*a):print('a:', a)func5(23, 45)
func5(1, 2, 3, 4)# 这儿的x必须使用位置参数传参
def func6(x, *a):print('a:', a, 'x:', x)func6(20)   # a: () x: 20
func6(10, 20, 30, 40)   # a: (20, 30, 40) x: 10# 这儿的x必须使用关键字参数传参
def func7(*a, x=90):print('a:', a, 'x:', x)func7(23, 34, 45)    # a: (23, 34, 45) x: 90
func7(1, 2, 3, 4, x=100)    # a: (1, 2, 3, 4) x: 100def func8(**num):print(num)func8()
func8(a=100)    # {'a': 100}
func8(name='张三', age=30)    # {'name': '张三', 'age': 30}# 面试题:func(*args, **kwargs) , 函数func中*args, **kwargs有什么意义
# 让函数调用的时候更加灵活def func(*args, **kwargs):passfunc()
func(2, 3, 4)
func(a=23, b=23, c=34, d=11)
func(23, 31, a=1, b=290)