资讯动态

python03

发布时间:2026/9/5 15:11:16 来源:尧图企业网站定制
python基础 (v3.6.6)6-31. 函数日常写的线性代码不具有复用性可以使用函数提高代码的复用性内置函数 print()、 input()、 range()等自定义函数人为构造的函数def stu(name):print(我叫name)stu(tom) #调用函数def stu(name):return 我叫nameprint(stu(lily)) #调用函数无参函数def 函数名():执行数据return 返回值def plus():a,b 5,6return a bprint(plus()) #调用函数注意在实际应用中无参函数很少使用课程主要讲有参函数有参函数def 函数名(参数列表):执行数据return 返回值def plus2(a,b):return a bprint(plus2(3,4)) #调用函数在python中不可变的数据类型有 str, tuple, int, float, set。可变的数据类型有list,dict可变、不可变可以使用id()打印数据的地址修改后再打印数据地址比对python调用函数时传递的参数类型分为以下几种位置参数、关键字参数、默认参数、不定长参数1-1. 位置参数def who(name,age):return 我是{}今年{}岁.format(name,age)print(who(tom,20)) → 我是tom今年20岁print(who(20,tom)) → 我是20今年tom岁print(who(nametom,age20)) → 我是tom今年20岁print(who(age20,nametom)) → 我是tom今年20岁调用函数时传入的两个值按照位置顺序依次赋给参数1-2. 默认参数def who(name,age18):return 我是{}今年{}岁.format(name,age)print(who(tom)) → 我是tom今年18岁print(who(tom,25)) → 我是tom今年25岁print(who(nametom,age25)) → 我是tom今年25岁注意默认参数需要放到后面且默认参数必须指向不变对象def def3(name lily,age 25):return 我是%s今年%d岁%(name,age)name1 tomage1 666print(def3()) →我是lily今年25岁print(def3(name1)) →我是tom今年25岁print(def3(name1,age1)) →我是tom今年666岁#print(def3(name,age)) #这里不知道nameage是什么所以会报错1-3. 可变参数不定长参数# 加了星号 * 的参数会以元组(tuple)的形式导入def test(a,*b):return a,bprint(test(2)) → (2, ())print(test(2,666)) → (2, (666,))print(test(2,666,888)) → (2, (666, 888))例给定一组数字 abc …… 请计算a2 b2 c2 ……由于参数个数不确定可以把abc……作为一个list或tuple传进来。def calc(*numbers):sum 0for n in numbers:sum sum n * nreturn sumnums [1, 2, 3]print(calc(*nums)) → 14注 *nums表示把nums这个list的所有元素作为可变参数传进去可变参数允许传入0个或任意个参数这些可变参数在函数调用时自动组装为一个tuple1-4.关键字参数可以扩展函数的功能#加了两个星号 ** 的参数会以字典的形式导入def test(a,**b):return a,bprint(test(2)) → (2, {})print(test(2,i666)) → (2, {i: 666})print(test(2,i666,j888)) → (2, {i: 666, j: 888})b {i:666,j:888}print(test(2,**b)) → (2, {i: 666, j: 888})def person(name, age, **kw):if city in kw: # 检查如果有city参数就怎么样passprint(name:, name, age:, age, other:, kw)extra {city: emei, job: tester}person(Jack, 24, **extra) →name: Jack age: 24 other: {city: emei, job: tester}关键字参数允许传入0个或任意个含参数名的参数这些关键字参数在函数内部自动组装为一个dict使用*args和**kw是Python的习惯写法也可以用其他参数名1-5. 命名关键字参数限制关键字参数的名字命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数def person(name, age, *, city, job):print(name, age, city, job) # 本例中只接收city和job作为关键字参数命名关键字参数必须传入参数名这和位置参数不同。如果没有传入参数名调用将报错person(Jack, 24, cityemei, jobtester) →Jack 24 emei testerperson(Jack, 24, Beijing, Engineer) →报错命名关键字参数可以有缺省值从而简化调用def person(name, age, *, cityBeijing, job):print(name, age, city, job)person(Jack, 24, jobEngineer) →Jack 24 Beijing Engineer由于命名关键字参数city具有默认值调用时可不传入city参数若函数定义中已经有了一个可变参数后面跟着的命名关键字参数就不再需要一个特殊分隔符*了def person(name, age, *args, city, job):print(name, age, args, city, job)命名的关键字参数是为了限制调用者可以传入的参数名同时可以提供默认值。1-6.参数组合定义函数可用必选参数、默认参数、可变参数、关键字参数和命名关键字参数5种参数可组合使用但参数定义的顺序必须是必选参数、默认参数、可变参数、命名关键字参数和关键字参数def f1(a, b, c0, *args, **kw):print(a , a, b , b, c , c, args , args, kw , kw)def f2(a, b, c0, *, d, **kw):print(a , a, b , b, c , c, d , d, kw , kw)f1(1, 2) →a 1 b 2 c 0 args () kw {}f1(1, 2, c3) →a 1 b 2 c 3 args () kw {}f1(1, 2, 3, a, b) →a 1 b 2 c 3 args (a, b) kw {}f1(1, 2, 3, a, b, x99) →a 1 b 2 c 3 args (a, b) kw {x: 99}f2(1, 2, d99, extNone) →a 1 b 2 c 0 d 99 kw {ext: None}虽然可以组合多达5种参数但不要同时使用太多的组合否则函数接口的可理解性很差1-7. 局部变量和全局变量局部变量定义在函数内部的变量只能在其被声明的函数内部访问。全局变量定义在函数外部的变量可以在整个程序范围内访问。total 25def test(a,b):total abreturn total#调用函数打印局部变量print(test(5,3)) → 8#打印全局变量print(total) → 25在函数内修改全局变量total 25def test(a,b):global total #引入全局变量print(全局变量是,total) → 全局变量是25total abreturn total#调用函数打印局部变量print(test(5,3)) → 8#打印全局变量print(total) → 8注意在函数内部引入变量使用global若在脚本中有类、类函数则变量在类里面修改、类函数修改之前都需要先global声明1-8. 匿名函数匿名函数是不使用def语句这样标准的形式来定义一个函数。匿名函数的好处是用完一次就可以扔掉使用lambda不需要考虑命名的问题。语法 lambda 参数: 表达式#将匿名函数赋值给变量func lambda a,b: ab#通过变量来调用匿名函数print(func(2,5)) → 7#以下示例对比普通函数和匿名函数最大值函数#普通函数def max(a,b):if ab:return aelse:return bprint(max(5,3))#匿名函数func lambda a,b: a if ab else bprint(func(5,3))注意不一定非要使用lambda函数任何能够使用它们的地方都可以定义一个单独的普通函数来进行替换。我们将它们用在需要封装特殊的、非重用代码上避免令我的代码充斥着大量单行函数。通常情况下匿名函数很少单独使用会结合python的高阶函数进行使用比如map(),reduce(),filter()zip()这些函数。补pass是占位符当函数体不知道写什么时可以用pass占位保证程序不报错2. 模块在python中一个.py文件就是一个模块。模块可以理解为是一个包含了函数和变量的py文件在程序中引入某个模块就可以使用其中的函数和变量。windows下面的文件夹中包含__init__.py文件的文件夹称之为 包windows下面的文件夹下面的.py文件称之为模块python自带了功能丰富的标准库另外还有数量庞大的各种第三方库。语法 import 模块名from 模块名 import 方法from time import * # 表示导入time模块下所有方法import mokuai as mk # 补充 将模块名别名成mk2-1. random模块# randint()可以在连续整数范围内随机获取一个整数import randomnum random.randint(1,5)print(num) # 随机打印1~5之间任意整数# choice()可以随机获取字符串、列表、元组中的元素from random import choicelist1 [tom,666,橘子]a choice(list1)print(a)#练习在1到100中随机获取10个唯一的整数from random import randintlist1 []while True:i randint(1,100)if i not in list1:list1.append(i)if len(list1) 10:breakprint(list1)2-2. os模块# 1.获取当前的工作目录import osprint(os.path.abspath(.)) # 运行脚本的工作路径print(os.getcwd()) # 运行脚本的工作路径# 2.获取当前文件完整路径print(os.path.abspath(__file__)) # 模块文件完整路径# 3.获取上一级路径os.path.dirname(路径)print(os.path.dirname(rC:\test\test1.py)) # 当前文件的上一级路径print(os.path.dirname(os.getcwd())) # 运行脚本所在的路径的上一级路径os.path.dirname(__file__) # 模块文件所在路径win直接当前运行会不识别os.path.dirname(os.path.abspath(__file__)) # 模块文件所在路径常用# 4.列出当前文件所属目录下面的所有文件和目录print(os.listdir())# 5.判断文件还是文件夹path1 C:\课堂练习\python练习\周末班.pypath2 C:\课堂练习\python练习print(os.path.isfile(path1)) # 如果是文件就返回Trueprint(os.path.isdir(path2)) # 如果是文件夹就返回True# 6.将ab两个路径连接起来os.path.join(路径a,路径b)cur os.getcwd()new os.path.join(cur,test2.py)print(new)# 注意要连接的两个路径前面路径的末尾、后面路径的开头不能有\new2 os.path.join(rC:\test,rtest2\test3.py)print(new2)# 7.创建一个文件夹 os.mkdir(文件夹名称)os.mkdir(test1) #直接在当前位置创建了一个test1的文件夹os.mkdir(os.path.join(os.getcwd(),test)) #一样的效果# 8.删除文件夹 os.rmdir(文件夹名称)os.rmdir(./test1)os.rmdir(test2)# 9.删除文件 os.remove(文件名)os.remove(test1.py)# 10.修改文件名 os.rename(源文件的路径\文件名,目标文件的路径\文件名)os.rename(rE:\pywork\新建文本文档.txt,rE:\pywork\666.txt)# 11.将一个路径拆分成文件夹路径和文件名字os.path.split(路径)path1 os.path.abspath(__file__)print(path1) → C:\课堂练习\python练习\周末班.pyprint(os.path.split(path1)) → (C:\\课堂练习\\python练习, 周末班.py)# 12.将一个路径处理成文件名print(os.path.basename(rE:\pywork\666.py)) → 666.pyprint(os.path.basename(rE:\pywork\666.py).split(.)[0]) → 666# 13.将一个文件名拆分成名字和后缀(如.py) : os.path.splitext(路径)path2python周末班练习题.pyprint(os.path.splitext(path2)) → (python周末班练习题, .py)# 14.将不规范的路径变成规范的路径os.path.normpath(路径)path2C:\\\课堂练习//python练习/\/周末班.pyprint(os.path.normpath(path2)) → C:\课堂练习\python练习\周末班.py2-3. time模块#导包import time# 1.等待固定时长time.sleep(2) #等待2秒# 2.获取当前系统时间# 分别表示星期、月份、日期、时分秒、年份print(time.ctime()) → Wed Feb 9 16:29:44 2022# 时间戳从1970年1月1日0时0分0秒到现在的秒数print(time.time()) → 1644395384.006# 时间元组分别表示年、月、日、时、分、秒、一周第几日 (0是周一)、一年第几日、夏令时标志1表示执行夏令时0表示不执行夏令时-1表示不清楚是否执行print(time.localtime())→ time.struct_time(tm_year2022, tm_mon2, tm_mday9,tm_hour16, tm_min29, tm_sec44, tm_wday2, tm_yday40, tm_isdst0)# 3.将日期转换为字符串strftime(格式,时间)print(time.strftime(%Y-%m-%d %H:%M:%S,time.localtime())) → 2022-02-09 16:58:38# 补充了解①from time import *print(strftime(%F)) →2021-11-03print(strftime(%X)) →10:02:38print(strftime(%Y-%m-%d)) →2021-11-03print(strftime(%H:%M:%S)) →10:02:38②from datetime import date,timedeltaprint(date.today()) →2021-11-03print(date.today() timedelta(-3)) →2021-10-31endtime str(date.today()) 12:12:12print(endtime) →2021-11-03 12:12:122-4. 自定义模块自定义模块模块里面的内容要自己写然后在需要使用模块里面的方法时再把模块导进来用。自定义模块calc1、calc2、clac3、calc4的内容都一样的def jia():return abdef jian():return a-bdef cheng():return a*bdef chu():return a/b# 1.自定义模块与脚本文件在同一个文件夹下from calc1 import jiaprint(jia(3,5))注脚本文件test.py跟自定义模块calc1.py都在同一个文件夹下# 2.自定义模块在脚本文件的子文件夹下from haha.calc2 import jia,jianprint(jian(5,3))注脚本文件是test\lianxi.py自定义模块是test\haha\calc2.py# 3.自定义模块在脚本文件的父级文件夹下可以使用相对路径import syssys.path.append(../) #导入临时路径from calc import *print(cheng())注脚本文件是liu\test\lianxi.py自定义模块是liu\calc.py# 4.自定义模块跟脚本文件离得太远用绝对路径import syssys.path.append(rD:\test)from calc import *print(chu())注脚本文件是C:\liu\lianxi.py自定义模块是D:\test\calc.py3. 文件读写text文本的读写3-1. 文件的打开和关闭语法open(文件的路径,打开的方式)文件的句柄.close()f open(./test1.txt,w) #打开文件f.close() #关闭文件print(f.closed) #判断是否关闭文件如果关闭返回True打开方式r只读模式文件必须存在不存在则返回异常FileNotFoundError默认值w覆盖写模式文件不存在则创建存在则完全覆盖不可读x创建写模式文件不存在则创建存在则返回异常FileExistsErrora追加写模式文件不存在则创建存在则在文件最后追加内容t文本文件模式默认值打开一个文件进行更新(可读可写)r可读可写不能创建文件会从后面追加内容w打开文件用于读写。如果文件存在则打开并从头编辑删除原有内容。不存在则创建。a打开文件用于读写。如果文件存在打开时是追加模式。文件不存在则创建。b二进制文本模式以二进制模式打开文件而不是以文本模式不能指定编码3-2.往文件里写入内容 write()、writelines()# 打开文件f open(./test1.txt,w)str1 人生苦短\n我用python\nlist1 [人生苦短\n,我用python\n]list2 [tom,666]# 将一个字符串写入文件 write()f.write(str1)# 将字符串或列表写入文件writelines()f.writelines(str1) #将字符串写入文件f.writelines(list1) #可以将字符串形式的列表、元组、集合写入文件f.writelines(list2) #不支持非字符串形式的列表等会报错f.close() #关闭文件print(文件是否被关闭,f.closed)3-3.读取文件的信息f open(./test12.txt,r) #打开文件print(f.read(3)) #读取前3个字符注意换行符不会显示但会占据空间print(f.read()) #读取文件全部内容print(f.readline()) #读取文件第一行print(f.readlines()) #读取所有的内容并以列表的形式保存f.close() #关闭文件# 练习把下面的文件内容写到一个文件里面然后读取文件的内容并计算平均分文件内容如下:小白,88小黑,90.5小黄,小花,33#写入文件内容f open(./test1.txt,w)str1 小白,88\n小黑,90.5\n小黄,\n小花,33f.write(str1)f.close()print(文件是否关闭,f.closed)#读取文件f open(./test1.txt,r)res f.readlines()print(res)total 0for i in res:# print(i)# strip()移除字符串两端的空格split()以指定字符切割字符串切割后保存为列表res2 i.strip().split(,)[1]# print(res2)if res2 ! :total total float(res2)#平均分avg total / len(res)print(avg)3-4.使用上下文管理关键字with方法上面的操作都要使用.close()方法来关闭文件使用 with open .. as 方法就可以不需要单独进行关闭系统会自动关闭文件。# 写入文件with open(./test1.txt,w) as f:f.write(人生苦短\n我用Python\n)print(检查文件是否关闭,f.closed)# 读取文件with open(./test1.txt,r) as f:res f.read()print(res)print(检查文件是否关闭,f.closed) # False没关闭print(检查文件是否关闭,f.closed) # True已经关闭# 练习将test0000~test9999共一万行的账号写入txt文件。with open(test01.txt,w) as f: # w覆盖写可创建for i in range(10000):# print(test%04d%i)f.write(test%04d\n%i)

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价