
编写一个循环生成0-9之间的列表 目标 list1 [0,1,2,3,4,5,6,7,8,9] # 1.早期while循环list1[]i0whilei10:list1.append(i)i1print(list1)# 2. 后期for循环list2[]foriinrange(10):list2.append(i)print(list2)# 3. 能不能进一步简化for循环结构# 可以 用列表推导式# 原理 首先执行for循环结构# 每次循环会把得到的变量值写入到列表中list3[iforiinrange(10)]print(list3)编写一个列表推导式简化for…if结构 生成0-9之间的偶数序列 [0,2,4,6,8] # 1.传统代码list1[]foriinrange(10):ifi%20:list1.append(i)print(list1)# 2. 转换为列表推导式list2[iforiinrange(10)ifi%20]print(list2)编写一个列表推导式用来简化for循环嵌套结构 案例创建列表 [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] 看结构 外层本质还是一个列表内层每个元素都是一个元组每个元组中有两个元素 # 1. 传统代码list1[]foriinrange(1,3):# 1,2forjinrange(3):# 0,1,2list1.append((i,j))print(list1)# 2. 转换成列表推导式list2[(i,j)foriinrange(1,3)forjinrange(3)]print(list2)编写一个列表推导式简化for与集合 用户输入10, 表示要生成 1~10的每一个数字的2平方的集合 # 1. 传统代码# 定义一个空集合set1set()# 接受用户的输入numint(input(请输入数字))# 循环生成1-num之间的数字序列foriinrange(1,num1):# 把i追加到集合内部set1.add(i**2)print(set1)# 2.集合推导式numint(input(请输入数字))set2{i**2foriinrange(1,num1)}print(set2)编写一个字典推导式用来简化for循环与字典 # 使用字段表达式将列表中元素映射为键值对形成字典 # 定义名字列表 # 定义年龄列表 # 1. 传统方式names[Alice,Bob,Charlie]ages[25,30,35]dict1{}foriinrange(len(names)):dict1[names[i]]ages[i]print(dict1)# 2. 字典推导式names[Alice,Bob,Charlie]ages[25,30,35]dict2{names[i]:ages[i]foriinrange(len(names))}print(dict2)python函数的由来 函数作用1.代码重用 2.模块化编程面向过程编程 案例开发一个打招呼程序 # 1. 传统代码# 见到常老师print(您好)# 见到张老师print(您好)# 见到王老师print(您好)# 2.设计一个函数greeting(),专门用于打招呼defgreeting():print(您好)greeting()greeting()greeting()python函数的参数 # 2.设计一个函数greeting(参数),专门用于打招呼实现向不同的人打不同的招呼 # 见到常老师您好老常 # 见到张老师您好老张 # 见到王老师您好老王 # 为什么要有参数 随着传入参数的不同同一个函数也能更智能可以返回不同的执行结果 defgreeting(name):print(f您好,{name})greeting(老常)greeting(老张)greeting(老王)python函数中的return返回值 def 函数名称(参数): 函数体代码 return 函数最终地执行结果 调用函数并获取最终的返回结果 变量 函数名称(参数的值) 这个变量也可以进一步加工! return 本身没有输出能力如果想进一步输出可以用print() # 1. 封装一个函数用来求解两个参数的和defsum_num(num1,num2):resultnum1num2# 2.使用return返回结果给函数调用位置returnresult# 3.调用函数输出结果print(sum_num(10,20))# 4.我们还可以把函数的返回结果赋值给变量 然后进一步加工numsum_num(10,20)resultnum**2print(result)python中函数返回值的特殊情况一 函数的返回值是可选的可以有也可以没有不是必须的 如果函数没有返回值则打印这风格函数返回什么 答 返回None defsum_num(num1,num2):resultnum1num2# 这是打印的30print(result)# 记住如果函数没有返回值# 默认返回None# 这个输出结果是None 因为sum_num没有返回值所以返回Noneprint(sum_num(10,20))python中函数返回值的特殊情况二 在其他编程语言中一个函数默认只能返回一个结果 但是pyhon比较特殊 它允许一个函数中同时返回多个结果 #小结函数可以用return返回多个结果所有结果默认以元组的形式返回defcal_num(num1,num2):jianum1num2 jiannum1-num2 chengnum1*num2 chunum1/num2# 使用return同时返回returnjia,jian,cheng,chu# 调用函数打印最终结果print(cal_num(20,10))print(type(cal_num(20,10)))pythonn中函数的嵌套使用# 1. 定义一个函数funB()函数deffuncB():print(----funcB函数 开始执行----)print(funcB)print(----funcB函数 执行完毕----)# 2.定义一个函数funcA()函数deffuncA():print(----funcA函数 开始执行----)print(funcA)funcB()print(----funcA函数 执行完毕----)# 3. 调用funcA()函数funcA()#结论 代码永远都是从上到下一行一行执行遇到函数则直接进入到函数内部等待执行完毕再返回到原位置继续执行python函数的综合案例 案例编写一个函数用于获取4位长度的随机验证码 已知字符str1 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 每次调用函数自动生成验证码如fxB9 1. 最终封装为一个函数 def generate_code() 2.已知字符串 3.需要从字符串中抽取四个随机字符 4.用循环 importrandomdefgennerate_code():# 定义一个字符串str1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789# 定义一个变量用来接受4位验证码code# 编写循环 循环四次foriinrange(4):# 核心点从字符串中随机抽取一个字符indexrandom.randint(0,len(str1)-1)#使用字符串的拼接方法把所有字符拼接到code变量中codecodestr1[index]returncodeprint(gennerate_code())python变量的作用域num110# 全局作用域deffunc():# 局部作用域num220判断全局变量访问范围 pass: 内置关键词没有特殊含义主要用于占位 全局变量作用范围 1. 全局作用域中可以访问全局变量 2.全局变量也可以在局部作用域中访问 全局变量作用范围广 # 全局作用域num110deffunc():# 局部作用域print(num1)# 全局作用域中可以访问全局变量print(num1)func()判断局部变量访问范围 局部变量在局部作用域中定义的变量 局部变量访问范围 1. 局部作用域可以访问局部变量 2全部作用域不能访问局部变量,因为当函数执行完毕后函数内部的局部变量会被激素那几内存所回收 函数往往和局部变量一个整体当函数运行时开辟内存空间 当函数执行完毕后内存要及时回收避免浪费内存 这就会导致函数内部的局部变量也会被回收后续想访问就访问不到了 # 全局变量deffunc():# 局部变量num220# 访问局部变量print(num2)func()# print(num2) 会报错global关键字的使用 默认情况下我们不能在局部作用域中对全局变量进行修改 但是我们可以使用global关键字从而实现修改操作 global 不能单独使用只能用在函数的内部(局部作用域中)作用声明全局变量 # 1.定义一个全局变量num10list1[1,2,3,4]# 2. 定义一个函数funcdeffunc():# 局部作用域# 使用global声明全局变量globalnum num100# 调用func函数func()print(num)python函数中的实参和形参 形参 函数定义时所指定的参数 实参 函数调用时所指定的参数 # 定义一个greeting函数# 这个name是形参defgreeting(name):print(f您好{name})# 这个name是实参name老张greeting(name)python中函数的两种传参方式 在python代码中函数一般有两种传参方式 位置传参 根据参数的位置进行值传递位置不能调整 必须固定 关键词传参 根据参数名称采用参数 参数值 进行参数传递 # 1. 定义一个函数 user_infodefuser_info(name,age,address):print(name)print(age)print(address)# 2. 位置传参 根据参数位置传递参数值user_info(Tom,23,成都)# 3. 关键词参数根据关键词名称传递参数值user_info(nameRose,address西安,age24)python中的缺省参数# 默认值参数就是子啊函数定义是给参数添加默认值defuser_info(name,age,gender男):print(name)print(age)print(gender)# 传参不传默认值参数print(user_info(张飞,33))# 传参覆盖默认值user_info(貂蝉,23,女)不定长参数之包裹位置参数defuser_info(*args):print(args)print(type(args))# 2. 使用位置传递参数# 不传参user_info()# 只传一个参数user_info(Tom)# 传入多个参数user_info(Tom,23,10086)不定长参数之包裹关键词参数# 1. 定义一个函数defuser_info(**kwargs):print(kwargs)print(type(kwargs))# 如果是kwargs包裹关键词参数那么参数只能传递键值对的方式user_info()# 只传递一个参数user_info(nameRose)# 传入多个参数user_info(nameTom,ba,mobile10086)不定长参数混用场景# 要求封装一个函数用于求解元素中的所有值 与字典中的所有元素值的和# *args 不仅可以接受位置参数还可以接受列表和元组传参# **kwargs 不仅可以接受关键词传参还可以接受字典传参defsum_num(*args,**kwargs):# 定义一个累加变量sumsum0foriinargs:sumiforjinkwargs.values():sumjprint(sum)# 1.定义一个元组变量tuple1(1,2,3)# 2. 定义一个字典变量dict1{a:4,b:5}sum_num(*tuple1,**dict1)不可变类型# 1.定义一个变量a10# 使用id方法返回变量在内存中的地址print(id(a))# 把变量小a 赋值给变量小bba# 改变a的值,b的值不会改变# 变量ab都是不可变类型# 我们把这种变量就称为不可变类型# 综上所述数字、布尔、字符串、元组都属于不可变类型a100print(b)print(id(b))# 值改变 地址也改变print(id(a))可变类型a[10,20,30]#2. 把a赋值给bbaprint(a)print(b)# 当我们改变了变量a时问变量b是否会受到影响# 答答案[10,20,30,40],因为列表是可变类型# 内存地址不变值可变print(id(a))a.append(40)print(b)print(id(b))可变类型对传参的影响# 定义一个函数deffunc(mynames):mynames.append(赵六)# 定义一个全局变量names[张三,李四,王五]#调用函数func()print(names)不可变量对传参的影响deffunc(num):globala a1num1# 定义一个全局变量a10# 调用函数func(a)print(a)元组的拆包操作 元组中有多少个变量左边一定要有多少个数据 # 定义一个元组tuple1(10,20)# 拆包num1,num2tuple1print(num1,num2)# 以上语法还可以简化num1,num2(10,20)print(num1,num2)# 以上语法还可以简化num1,num2210,20print(num1,num2)两个变量值的交换# 桌子上有两个杯子c1牛奶c2可乐# 经过一系列操作把c1和c2的值进行交换# 没学之前c3c1 c1c2 c2c3print(c1,c2)# 自动拆包c1,c2c2,c1print(c1,c2)list1list(range(5))print(2inlist1)