| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> Python知识库 -> Python学习笔记之入门基础 -> 正文阅读 |
|
|
[Python知识库]Python学习笔记之入门基础 |
课程链接:Python入门教程——基础阶段_哔哩哔哩_bilibiliPython学习笔记注释单行注释: * 多行注释: 1.多行前面加# 2."""注释信息""" 3.'''注释信息''‘ 如果代码字符有问题,可能是版本的问题,在代码中加入# encoding=utf-8或者是# *coding:utf-8*(Python3直接支持,Python2默认不支持) 变量
变量注意事项:1.一个变量只能引用一个数值 2.命名规范 字母数字下划线 见名知意 驼峰标识 关键字 区分大小写 3.变量名使用之前一点要赋值
运算符非布尔类型的值,如果作为真假来限定,一般都是非零即真,非空即真。 print(1 or True) ? ?1 print(0 and True) ? 0 print(1 and 3) ? ? ?3 ? ? ? 输出当前识别到的表达式 print(0 and True) ? 0 print(bool(1)) ? ? ?True 输入和输出
Python2 以下三个输出是一样的,都是:我的名字是ss,年龄是23 name = "ss" age = 24 print "我的名字是:", name, ", 年龄是:",age name = "ss" age = 24 result = "我的名字是%s, 年龄是%d"%(name, age) print result name = "ss"
age = 24
print "我的名字是{0}, 年龄是{1}".format(name,age)
#输出到文件中(把xxxxxx输出到text,txt文件中)
f = open("test.txt","w")
print >>f,"xxxxxx"
输出不自动换行,后面加逗号即可 输出的各个数据,使用分隔符分割 print ?"a", "-", "b", "-", "c" a - b - c print "-".join(["a", "b", "c"]) a-b-c Python3 print() ?#把Python2的代码放在括号里面就可以了 #输出到文件中(把xxxxxx输出到text,txt文件中)
f = open("test.txt","w" )
print("xxxxxx",file = f)
输出不自动换行,但是输出可以编辑,通过end函数 #end里面写的是跟在前面字符串后面的东西
print("123",end="/n")
#代表输出换行
print("")
输出的各个数据,使用分隔符分割,用sep函数 print("1", "2", "3", sep="^^^")
占位格式符mathScore = 100
englishScore = 90
print("我的数学成绩是%d, 英文的分数是%d"%(mathScore,englishScore))
print("我的数学成绩是%d, 英文的分数是%d"%(englishScore,mathScore))
print("我的数学成绩是%(es)d, 英文的分数是%(ms)d"%({"es":englishScore,"ms":mathScore}))
print("我的数学成绩是%(ms)d, 英文的分数是%(es)d"%({"es":englishScore,"ms":mathScore}))
在%和d之间填写数字表示占用的宽度,+表示宽度在数字的左边,—表示在右边 print("%d" % mathScore)
0表示用0填充 min = 3
sec = 5
print("%02d:%02d"%(min,sec))
#2d表示占用的宽度为2,0表示空余位置补0,但是0如果换成其他数字即与2合在一起表示所占用的宽度
score = 59.9
print("%d"%score)
print("%f"%score)
print("%.2f"%score)
? 当字符串中存在格式化标志时,用两个%%表示% 分支if else与 if elif
while 一定要注意循环结束条件,防止死循环 在Python中,没有类似其他语言的do...while循环 for
break 打断整个循环,跳出整个循环 continue 结束本次循环,继续执行下次循环 pass 它是空语句,不做任何事情,一般用作占位语句 内建函数
math模块函数(需要导入包 import math)随机函数(需要导入包 import random)import random print(random.random()) # 从一个序列中,随机挑选一个数值 seq = [1, 3, 5, 7, 9] print(random.choice(seq)) # 范围之内的随机小数 [] print(random.uniform(1,3)) # 范围之内的随机整数 [] print(random.randint(1,3)) # 给定区间内的一随机整数 【) 2为步长,1,3 5 7...13 print(random.randrange(1,14,2)) 数字常量 π == pi # 三角函数里面的参数是一个弧度,角度 hudu1 = 1/ 6 * math.pi hudu2 = math.radians(30) # radians可以把角度转为弧度 print(math.sin(hudu1)) print(math.sin(hudu2)) 转义符(一个字节个数)# 我是ss 在打印的两边引号前面加上转义字符 \ name = "我是\"ss\"" print(name) # 续行符 \只可以续一行 name = "s"\ "s"\ "123" print(name) 原始字符串# 输出里面所有的内容,包括一下符号在内容前面加原始字符串r name = r"我是 \n \t ss" print(name) 单双号混合使用可以避免使用引号转义符 name = '我是"ss"' print(name) 一般内容需要写成一行,如果跨行的话,需要连行符 \ 或者小括号(所有的内容) 三引号 """ """ 可以直接跨行书写,也可以用于注释 print("ss \t"* 10)
字符串函数操作 字符串的切片又指针的方式 [] seq = "asdfghj" print(seq[0]) # a print(seq[-1]) # j print(seq[0]) # a print(seq[-1]) # j print(seq[0:3]) # asd # 步长为2,若写的步长>0,从左到右,<0,从右到左 # 步长要注意不能够从头部跳到尾部,或者从尾部跳到头部 print(seq[0:3:2]) # ad print(seq[0:len(seq):1]) # asdfghj print(seq[::]) # asdfghj print(seq[::-1]) # jhgfdsa # 0这个位置取不到 print(seq[6:0:-1]) # jhgfds print(seq[-1:-6:-1]) # jhgfd 字符串中如果是内建函数可以直接使用,不是的话就用 :对象.方法(参数) 查找计算函数# find()从左到右查找,找到之后马上停止,区间是 [ )
name = "wo shi ss"
print(name.find("s")) 3
print(name.find("s",4)) 7
print(name.find("s",8)) 8
print(name.find("s",3,7)) 3
print(name.find("s",4,7)) -1
# rfind()从右到左查找,找到之后马上停止,区间是 [ )
# index()与find()不一样的是找不到直接报错
# rindex()与index()方向相反
# count()表示查找个数
转换类函数# replace()并不会修改原字符串,而是输出一次修改后的。后面的数字表示更换的个数
name = "wo shi ss"
print(name.replace("s","z",1))
# capitalize()改变字符串首字母单词大写
print(name.capitalize())
# title()字符串中每个单词的首字母大写,如果有分隔符的话,分隔符两边算单词
print(name.title())
# lower()讲字符串中每个字符都变成小写
print(name.lower())
# upper()讲字符串中每个字符都变成大写
print(name.upper())
填充压缩类函数# lstrip()仅仅只移除左侧的字符,而且是第一个字符集,像/n,/t,空格都算。移除的是括号里面的字符集所有的每个字符,而不是一个整体
name = " wo shi ss "
print("|" + name.lstrip() + "|") # |wo shi ss |
name = "wwoo shi ss "
print("|" + name.lstrip() + "|") # |wwoo shi ss |
print("|" + name.lstrip("wo") + "|") # | shi ss |
name = " wwoo shi ss wwoo "
print("|" + name.lstrip("wo") + "|") # | wwoo shi ss wwoo |
name = "wwoo shi ss wwoo "
print("|" + name.lstrip("wo") + "|") # | shi ss wwoo |
name = "awwoo shi ss wwoo "
print("|" + name.lstrip("wo") + "|") # |awwoo shi ss wwoo |
# rstrip()从右边开始
分割拼接类函数# split(分隔符,分割次数(不是份数)) 将一个大的字符串分割成几个小的字符串
info = "11-22-33-44"
print(info.split("-")) #['11', '22', '33', '44']
print(info.split("-",2)) #['11', '22', '33-44']
# partition(分隔符) 查收到分隔符,返回 (分隔符左侧内容,分隔符,分隔符右侧内容)
print(info.partition("-")) #('11', '-', '22-33-44')
# 没有的话,返回 (原字符串,"","")
print(info.partition("|")) #('11-22-33-44', '', '')
# rpartition() 从右边开始
# splitlines(布尔类型) 按照换行符(\r,\n),将字符串拆成多个元素,保存到列表中
name = "wo \n shi \r ss"
print(name.splitlines()) #['wo ', ' shi ', ' ss']
print(name.splitlines(True)) #['wo \n', ' shi \r', ' ss']
#join() 根据指定字符串,将指定的可迭代对象进行拼接,形成新的字符串
items = ["ss","23","131231"]
result = "+".join(items)
print(result) #ss+23+131231
判定操作类函数# isalpha() 字符串中所有字母是否都是字符
# isdigit() 字符串中是否所有字符都是数字
# isalnum() 字符串是否所有的字符都是数字或者字母
# isspace() 字符串中是否所有字符都是空白符
# startswitch("需要判定的字符串的前缀",判断开始位置,判定结束位置) 字符串是否以某个前缀开头
items = "2021-11-13:某某报告.xls"
print(items.startswith("2021-11")) #True
print(items.startswith("2021-11",0,2)) #False
# endswitch() 字符串是否以某个后缀结尾
# in 判定一个字符串,是否被另外一个字符串包含
print("sz" in "wo shi ssz") #True
print("sz" in "wo shi z") #False
# not 判定一个字符串,是否不被另外一个字符串包含
列表概念 字符串:不可变 列表:有序的可变的元素组合(可以存放不同的数据类型) 列表是可以嵌套的 # 列表推导式 num = [1,2,3,4,5] list = [nums ** 2 for nums in num] print(list) #[1, 4, 9, 16, 25] # for前面表示对for后面这个列表要进行的操作 list = [2 for nums in num] print(list) #[2, 2, 2, 2, 2] list = [nums ** 2 for nums in num if nums % 2 != 0] print(list) #[1, 9, 25] list = [nums ** 2 for nums in num for nums1 in num] print(list) #[1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 16, 16, 16, 16, 16, 25, 25, 25, 25, 25] 列表增加 #append() 在列表中追加一个新的元素,加最后。而且会修改原列表,本身方法没有什么访问值,所以返回是None num = [1,2,3,4,5] num.append(6) result = num.append(6) print(num) #[1, 2, 3, 4, 5, 6, 6] print(result) #None #insert() 插入所给定的值前面 num = [1,2,3,4,5] num.insert(3,6) result = num.insert(3,6) print(num) #[1, 2, 3, 6, 6, 4, 5] print(result) #None #extend() 往列表中扩展另外一个可迭代序列 #乘法运算 ["a"] * 3 = ["a","a","a"] #加法运算 ["a"] + ["b"] = ["a","b"] extend()是用来扩充两个集合的,append()是把一个元素追加到另外一个集合中去。 列表删除 #delete 删除一个指定元素
#pop(索引值) 移除并返回列表中指定索引所对应元素,索引值默认是-1
#remove() 移除列表中指定元素,如果有多个一样的,则只会删除最左边的一个(注意循环内删除列表元素所带来的坑)
for num in nums:
print(num)
if num == 2:
nums.remove(2)
print(nums)
1
2
2
4
2
[1, 3, 4, 2]
通过上面这个例子可以看出一个问题:当我们想移除一个列表中所有的指定元素时,不要在遍历当中,遍历内部这么去干
列表修改 当我们以后想要修改一个列表中的某一个元素时,一定是通过这个索引来操作指定元素的 列表查询 # 获取单个元素 index:正左负右
# 如果有多个相同的值的话可以加入查询的范围
index(str, beg=0, end=len(string))
# 获取多个元素(切片) items[start:end:step]
# 遍历常用方式:根据元素进行遍历和根据索引进行遍历,枚举函数
# 根据元素进行遍历: for items in list
values = ["a", "b", "a", "d"]
currentIndex = 0
for v in values:
print("v",end=" ")
print(values.index(v,currentIndex))
currentIndex += 1
v 0
v 1
v 2
v 3
# 根据索引进行遍历 for index in range(len(list))
values = ["a", "b", "a", "d", "d", "t"]
indexs = range(len(values))
for index in indexs:
print(index,values[index],end=" ")
0 a 1 b 2 a 3 d 4 d 5 t
# 枚举函数(了解) enumerate函数用于遍历序列中的元素以及它们的下标
values = ["a", "b", "a", "d", "d", "t"]
for index,value in enumerate(values):
print(index,end=" ")
print(value)
0 a
1 b
2 a
3 d
4 d
5 t
# 使用迭代器进行遍历
l = [1, 2, 3, 4, 5]
it = iter(l)
for v in it:
print(v)
print("----")
for v in it:
print(v)
# 迭代器不能重复
1
2
3
4
5
----
? 列表的判定和比较 # in 和 not in # cmp() 比较大小,从左到右逐一比较,但是python3版本中不支持这个函数,在python3版本中我们使用比较运算符进行比较 列表的排序 # 内建函数sorted(可迭代对象, key=None, reverse=False) reverse默认是False升序,如果是True,则是降序。如果可迭代对象是元组,则从左到右进行比较
s = [("sz",18), ("sz1",17), ("sz2",16), ("sz3",15)]
result = sorted(s)
print(result) # [('sz', 18), ('sz1', 17), ('sz2', 16), ('sz3', 15)]
def getKey(x):
return x[1]
result = sorted(s,key=getKey)
print(result) # [('sz3', 15), ('sz2', 16), ('sz1', 17), ('sz', 18)]
result = sorted(s,key=getKey,reverse=True)
print(result) # [('sz', 18), ('sz1', 17), ('sz2', 16), ('sz3', 15)]
# 列表对象方法list.sort(key=None, reverse=False)
s = [("sz",18), ("sz1",17), ("sz2",16), ("sz3",15)]
def getKey(x):
return x[1]
result = s.sort(key= getKey,reverse = False)
print(result,s) # None [('sz3', 15), ('sz2', 16), ('sz1', 17), ('sz', 18)]
列表的乱序和反转 # random.shuffle(list) 可以随机打乱一个列表,但是要导入random模块 import random l = [1, 2, 3, 4, 5] res = random.shuffle(l) print(res,l) # None [2, 5, 1, 4, 3] # reverse() 进行反转 res = l.reverse() print(res,l) # None [5, 4, 3, 2, 1] # 用切片的方式,与reverse不同的是不改变其本身 res = l[::-1] print(res,l) # [5, 4, 3, 2, 1] [1, 2, 3, 4, 5] 元组概念 元组:有序的不可变的元素集合(故元组只能查询) 一个元素的写法 (1,) 多个元素的写法 (1, 2, 3) ("asdf", [1, 2], 4) 多个对象,以逗号隔开,默认为元组 1, 2, 3, "ss" 从列表转换成元组 tuple() 注意:以后我们给一个变量命名时,千万不要命名成一个类型 元组可以是嵌套的 元素查询 # 获取单个元素 tuple[index] # 获取多个元素 tuple[start:end:step] 元素获取判定比较 # tuple.count(item) 统计元组中指定元素的个数 # tuple.index(item) 获取元组中指定元素的索引 # len(tup) 返回元组中元素的个数 # max(tup) 返回元组中元素最大的值 # min(tup) 返回元组中元素最小的值 # 判定 in 和 not in # cmp() 比较如果比较的是元组, 则针对每个元素, 从左到右逐一比较左 > 右 1;左 == 右 0;左 < 右 -1;Python3.x不支持 元组拼接拆包 拼接:+,* 拆包:a, b = (b, a) 字典概念 字典:无序的,可变的键值对集合 # {key: value, key: value...}
# fromkeys(S, v=None) 类和对象都可以调用
# 类调用
d = dict.fromkeys("abc",666)
print(d) # {'a': 666, 'b': 666, 'c': 666}
# 对象调用(用处不大,一般不使用)
d = {1: 2, 3: 4}.fromkeys("abc",666)
print(d) # {'a': 666, 'b': 666, 'c': 666}
# key不能重复,如果重复后面就会把前面的给覆盖。而且字典必须是任意不可变类型(列表,字典,可变集合等是可变的,数值,布尔,字符串,元组是不可变的)
字典增加 d = {"name": "sz", "age": "18"}
d["height"] = 180
print(d,type(d))
{'name': 'sz', 'age': '18', 'height': 180} <class 'dict'>
字典删除 # del key必须要存在
d = {"name": "sz", "age": "18"}
del d["age"]
print(d)
# pop(key) 删除指定的键值对, 并返回对应的值。如果key, 不存在, 那么直接返回给定的default值; 不作删除动作。如果没有给定默认值, 则报错
# popitem() 删除按升序排序后的第一个键值对, 并以元组的形式返回该键值对
# clear() 删除字典内所有键值对.注意字典对象本身还存在, 只不过内容被清空,与del不一样
字典改 # 只能改值,不能改key
# dic[key] = value 修改单个键值对
d = {"name": "sz", "age": "18"}
d["age"] = 20
d["age1"] = 22
print(d) # {'name': 'sz', 'age': 20, 'age1': 22}
# 批量修改键值对 update()
d.update({"age": 666, "address" : "上海"})
print(d) # {'name': 'sz', 'age': 666, 'address': '上海'}
字典查询 # dic[key] 获取单个值
d = {"name": "sz", "age": "18"}
print(d["age"]) 18
# dic.get(key[, default]) 获取单个值.如果没有默认值,则为None,原字典不会新增这个键值对,
d = {"name": "sz", "age": "18"}
v = d.get("age1",666)
print(v) 666
# setdefault(key[,default]) 获取单个值,如果key不存在, 则设置给定默认值, 并返回该值,无默认值则返回None
d = {"name": "sz", "age": "18"}
v = d.setdefault("age1")
print(v,d) #None {'name': 'sz', 'age': '18', 'age1': None}
v = d.setdefault("age1",666)
print(v,d) #666 {'name': 'sz', 'age': '18', 'age1': 666}
# values() 获取所有的值
# keys() 获取所有的键
# items() 获取字典的键值对
# Python2.x和Python3.x版本之间关于获取键, 获取值, 获取item, 之间的区别:Python2.x 直接是一个列表,可通过下标进行获取指定元素。Python3.x 中是Dictionary view objects(字典视觉对象)(字典本身发生变化,view objects也会发生变化)
d = {"name": "sz", "age": "18"}
vs = d.values()
print(vs) #dict_values(['sz', '18'])
print(vs[0]) #TypeError: 'dict_values' object is not subscriptable
print(list(vs)[0]) #sz
d["address"] = 666
print(d) #{'name': 'sz', 'age': '18', 'address': 666}
# 遍历有两种:key()和items(),推荐使用items()
d = {"name": "sz", "age": 18, "address": "上海"}
keys = d.keys()
for key in keys:
print(key,end=" ")
print(d[key])
name sz
age 18
address 上海
its = d.items()
for k, v in its:
print(k, v)
name sz
age 18
address 上海
字典计算和判定 # len() 键值对的个数 # x in dic 判断dic中的key是否x # x not in dic 判断dic中的key是否x 集合概念 集合:无序的, 不可随机访问的, 不可重复的元素集合 集合分为可变集合(增,删,改)和不可变集合(创建好之后无法增删改),可变集合类型为set,不可变集合类型为forzenset # 可变集合定义 set()
# 可变集合推导式(有两种)
s = set(x for x in range(0,10))
tup = {x for x in range(0,10)}
print(s,type(s)) #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'>
print(tup,type(tup)) #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'>
# 不可变集合定义 forzenset()
# 不可变集合推导式(只有一种)
s = frozenset(x for x in range(0,10))
print(s,type(s)) #frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}) <class 'frozenset'>
注意:1.创建一个空集合时, 需要使用set() 或者 frozenset(), 不能使用 s = {},否则会把它识别成字典 2.集合中的元素, 必须是可哈希的值(如果一个对象在自己的生命周期中有一哈希值(hash value)是不可改变的,那么它就是可哈希的(hashable)的) 3.集合中的元素不可重复,如果重复,则合并一个(利用此特性可以用于去除重复性) 可变集合增 # add() 可变集合删 # remove() 删除指定元素,如果集合中没有这个元素,则返回一个错误 # discard() 删除指定元素,若没有这个元素,则do nothing # pop() 随机删除并返回一个集合中的元素,若集合为空,则返回一个错误 # clear() 清空一个集合中的所有元素,不是删除这个集合 可变集合改 元素为不可变类型, 不能修改 可变集合查 无法通过索引或key进行查询,通过for in 和迭代器进行遍历 集合遍历(可变和不可变一样) # for in
s = {1, 2, 3}
for v in s:
print(v)
# 迭代器
its = iter(s)
for s in its:
print(s)
集合之间交集 # intersection() 交集
# 注意可变与不可变集合混合运算,返回结果类型以运算符左侧为主
s1 = frozenset([1, 2, 3, 4, 5])
s2 = {4, 5, 6}
res = s2.intersection(s1)
print(res,type(res)) #{4, 5} <class 'set'>
res = s1.intersection(s2)
print(res,type(res)) #frozenset({4, 5}) <class 'frozenset'>
# intersection(Iterable)注意里面的Iterable是可哈希的
s1 = {"1", "2", "3", "4", "5"}
print(s1.intersection(["1", "2", ["1", "2"]])) #TypeError: unhashable type: 'list'
s1 = {"1", "2", "3", "4", "5"}
print(s1.intersection("123")) #{'1', '2', '3'}
print(s1.intersection({"1":"a", "2": "b"})) #{'1', '2'}
# & 交集()
集合之间并集 # union() 本身不发生变化
# |
# update() 本身变为更新之后的值
s1 = {1, 2, 3}
s2 = {1, 2, 4}
print(s1.union(s2),s1) #{1, 2, 3, 4} {1, 2, 3}
print(s1.update(s2),s1) #None {1, 2, 3, 4}
集合之间差集 # difference() # - # difference_update() 集合之间判定 # isdisjoint() 两个集合不相交 # issuperset()一个集合包含另一个集合(完全包含) # issubset() 一个集合包含于另一个集合 时间日历time模块 # 获取当前时间戳:从0时区的1970年1月1日0时0分0秒, 到所给定日期时间的秒数 import time res = time.time() years = res / (24 * 60 * 60 * 365) + 1970 print(years) #2021.9165015272404 # 获取时间元组:time.localtime([seconds]),seconds为可选的时间戳,默认为当前的时间戳 res = time.localtime() print(res) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=33, tm_sec=41, tm_wday=3, tm_yday=1, tm_isdst=0)
? 获取格式化的时间 # 秒 -> 可读时间: time.ctime([seconds]) t = time.time() print(time.ctime()) #Thu Nov 18 20:33:12 2021 # 时间元组 -> 可读时间: time.asctime([p_tuple]) res = time.localtime() time_tuple = time.asctime(res) print(time_tuple) #Thu Nov 18 20:33:12 2021 格式化日期字符串 <--> 时间戳 时间元组 -> 格式化日期 # time.strftime(格式字符串, 时间元组)
res1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
res2 = time.strftime("%y-%m-%d %H:%M:%S", time.localtime())
print(res1) #2021-11-18 20:32:12
print(res2) #21-11-18 20:32:12
? 格式化日期 -> 时间元组 # time.strptime(日期字符串, 格式符字符串) time.mktime(时间元组)
pt = time.strptime("2021-11-18 20:34:23", "%Y-%m-%d %H:%M:%S")
print(pt)
t = time.mktime(pt)
print(t)
获取当前CPU时间 # Python3.8已移除clock()方法,可以使用time.perf_counter()或time.process_time()方法替代。 休眠 # 推迟线程的执行, 可简单理解为, 让程序暂停 sleep() calendar模块 提供与日历相关的功能,比如: 为给定的月份或年份打印文本日历的功能 # 获取某月日历 calendar.month(年, 月) import calendar print(calendar.month(2021, 6)) datetime模块 Python处理日期和时间的标准库,这个模块里面有datetime类,此外常用的还有date类,以及time类 # 获取当天日期 import datetime t = datetime.datetime.now() print(t.today()) #2021-11-18 21:04:54.359243 print(t.year) #2021 ... # 计算n天之后的日期 t = datetime.datetime.now() res = t + datetime.timedelta(days= 7) print(t, res) #2021-11-18 21:09:32.082433 2021-11-25 21:09:32.082433 # 获取两个日期的时间差 first = datetime.datetime(2021, 9, 1, 12, 0, 0) second = datetime.datetime(2021, 9, 2, 12, 1, 1) res = second - first print(res) #1 day, 0:01:01 print(res.total_seconds()) #86461.0 Python函数概念 写了一段代码实现了某个小功能; 然后把这些代码集中到一块, 起一个名字; 下一次就可以根据这个名字再次使用这个代码块, 这就是函数 分类 内建函数,三方函数以及自定义函数 函数的基本使用 定义 def 函数名(): 函数体 def p():
print(4)
p()
#4
函数的参数 "参数名称"即为形参。在调用函数的时候, 传递的真实数据, 即为实参 # 一个参数
def p(num):
print(num * 2)
p(2)
#4
# 多个参数(严格按照顺序)
def p(num1,num2):
print(num1 * num2)
p(2,3)
#6
# 多个参数(不需要严格按照顺序)
def p(num1,num2):
print(num1) #2
print(num2) #3
print(num1 * num2) #6
p(num2=3,num1=2)
# 不定长参数:实参是元组的话在形参前面加 *
def mySum(* t):
res = 0
for s in t:
res += s
print(res) #10
mySum((1, 2, 3, 4))
# 不定长参数:实参是字典的话在形参前面加 **
def mySum(** dic):
print(dic) #{'name': 'ss', 'sex': '男'}
mySum(name = "ss", sex = "男")
# 把传递的参数, 包装成一个集合, 称之为"装包",把集合参数, 再次分解成单独的个体, 称之为"拆包"
def Sum(a, b, c, d):
print(a + b + c + d) # 10
def test(* args):
print(* args,type(args)) # 1 2 3 4 <class 'tuple'> 此处是拆包
Sum(* args) # 此处是装包
test(1, 2, 3, 4)
# 缺省参数:有默认值的参数 def 函数名(变量名1=默认值1, 变量名2=默认值2):
注意:传递有值传递和引用传递(地址传递),在python中只有引用传递(地址传递)但是,如果数据类型是可 可变类型,则可以改变原件。如果数据类型是不可变类型,则不可以改变原件。 函数的返回值 当我们通过某个函数, 处理好数据之后, 想要拿到处理的结果 语言:def 函数(): 函数体 return 数据 注意:return 后续代码不会被执行 如果想要返回多个数据, 可先把多个数据包装成一个集合, 整体返回(列表,元组,字典) def caculate(a, b):
he = a + b
cha = a - b
return (he, cha)
res = caculate(6, 7)
print(res[0]) #13
print(res[1]) #-1
he, cha = caculate(6, 7)
print(he) #13
print(cha) #-1
函数的使用描述 当我们编写三方函数, 为了方便他人使用, 就需要描述清楚我们所写的函数功能以及使用方式等信息。直接在函数体的最上面, 添加三个双引号对注释 查看函数使用文档:help(函数) 一般函数的描述, 需要说明如下几个信息:函数的功能,参数(含义,类型,是否可以省略,默认值)以及返回值(含义,类型) def caculate(a, b = 1):
"""
计算两个数据的和,差
:param a:数值1,数值类型,不可选,没有默认值
:param b:数值2,数值类型,可选,默认值:1
:return:返回的是计算的结果,元组:()和,差
"""
he = a + b
cha = a - b
return (he, cha)
help(caculate)
偏函数 当我们写一个参数比较多的函数时, 如果有些参数, 大部分场景下都是某一个固定值, 那么为了简化使用, 就可以创建一个新函数, 指定我们要使用的函数的某个参数, 为某个固定的值; 这个新函数就是"偏函数" # 借助functools模块的partial函数 partial(函数, 特定参数=偏爱值)
import functools
def test(a, b, c, d = 1):
print(a + b+ c + d)
newTest = functools.partial(test, c =5)
newTest(1, 1)
高阶函数 当一个函数A的参数, 接收的又是另一个函数时, 则把这个函数A成为是"高阶函数" l = [{"name": "ss1", "age" : 18}, {"name": "ss2", "age" : 19},{"name": "ss3", "age" : 17}]
def getKey(x):
return x["age"]
res = sorted(l, key=getKey)
print(res) #[{'name': 'ss3', 'age': 17}, {'name': 'ss1', 'age': 18}, {'name': 'ss2', 'age': 19}]
返回函数 是指一个函数内部, 它返回的数据是另外一个函数; 把这样的操作成为"返回函数" def getFunc(flag):
def sum(a, b, c):
return a + b + c
def reduce(a, b, c):
return a - b - c
if flag == " + ":
return sum
if flag == " - ":
return reduce
res = getFunc(" - ")
print(res(1, 2, 3))
匿名函数 也称为 "lambda函数",顾名思义, 就是指没有名字的函数 注意:只能写一个表达式,表达式的结果就是返回值。所以, 只适用于一些简单的操作处理 sum = lambda x, y: x + y
print(sum(1, 3)) #4
l = [{"name": "ss1", "age" : 18}, {"name": "ss2", "age" : 19},{"name": "ss3", "age" : 17}]
res = sorted(l, key= lambda x: x["age"])
print(res) #[{'name': 'ss3', 'age': 17}, {'name': 'ss1', 'age': 18}, {'name': 'ss2', 'age': 19}]
闭包 在函数嵌套的前提下,内层函数引用了外层函数的变量(包括参数),外层函数又把内层函数当做返回值进行返回,这个内层函数+所引用的外层变量, 称为 "闭包" ef test1():
a = 3
def test2():
print(a)
return test2
test = test1()
test()
3
# 根据配置信息, 生成不同的分割线函数
def line(content, length):
def line():
print("-" * (length // 2) + content + "-" * (length // 2))
return line
line1 = line("闭包", 20)
line1() #----------闭包----------
line2 = line("闭包啊啊啊", 30)
line2() #---------------闭包啊啊啊---------------
注意:1. 闭包中, 如果要修改引用的外层变量,需要使用 nonlocal 变量声明,否则当做是闭包内新定义的变量。 def test1(): def test1():
a = 3 a = 3
def test2(): def test2():
a = 4 nonlocal a
print(a) a = 4
print(a) print(a)
test2() print(a)
print(a) test2()
return test2 print(a)
test = test1() return test2
3 test = test1()
4 3
3 4
4
2.当闭包内, 引用了一个后期会发生变化的变量时, 一定要注意:函数是被调用时, 才去确定变量标识所对应的值 def test():
focus = []
for i in range(1, 4):
def test2():
print(i)
focus.append(test2)
return focus
newFucus = test()
print(newFucus)
newFucus[0]() #3
newFucus[1]() #3
newFucus[2]() #3
def test():
focus = []
for i in range(1, 4):
def test2(num):
def inner():
print(num)
return inner
focus.append(test2(i))
return focus
newFucus = test()
print(newFucus)
newFucus[0]() #1
newFucus[1]() #2
newFucus[2]() #3
装饰器 作用 在函数名以及函数体不改变的前提下, 给一个函数附加一些额外代码 语法 @装饰器 ? def 被装饰函数(): ? code 注意 装饰器的执行时间是立即执行 def check(func): def check(func):
def inner(): print("ss")
print("登录验证操作...") def inner():
func() print("登录验证操作...")
return inner func()
@check return inner
def fss(): @check
print("发说说") def fss():
fss() print("发说说")
登录验证操作... ss
发说说
进阶 装饰器叠加:从上到下装饰,从下到上执行 # 对有参函数进行装饰:1.无论什么场景, 保证函数调用参数个数一致2.为了通用, 可以使用不定长参数, 结合 拆包操作进行处理
def zsq(func):
def inner(* args, ** kwargs):
print("*" * 30)
func(* args, ** kwargs)
return inner
@zsq
def pnum(num1, num2, num3):
print(num1, num2, num3)
@zsq
def pnum2(num):
print(num)
pnum(1, 2, num3=666)
pnum2(2)
******************************
1 2 666
******************************
2
# 对有返回值的函数进行装饰:无论什么场景, 保证函数返回值一致
def zsq(func):
def inner(* args, ** kwargs):
print("*" * 30)
return func(* args, ** kwargs)
return inner
@zsq
def pnum(num1, num2, num3):
print(num1, num2, num3)
return num1 + num2 + num3
@zsq
def pnum2(num):
print(num)
res1 = pnum(1, 2, num3=666)
res2 = pnum2(2)
print(res1, res2)
******************************
1 2 666
******************************
2
669 None
# 带有参数的装饰器:通过@装饰器(参数)的方式, 调用这个函数, 并传递参数; 并把返回值, 再次当做装饰器进行使用
# 先计算@后面的内容, 把这个内容当做是装饰器
def getzsq(char):
def zsq(func):
def inner():
print(char * 30)
func()
return inner
return zsq
@getzsq("*") #括号里面的参数自己设置
def f1():
print("666")
f1()
******************************
666
生成器 概念 生成器是一个特殊的,更高级的迭代器,但是迭代器不一定是生成器 创建方式 生成器表达式:把列表推导式的[] 修改成 () 生成器函数:函数中包含 yield语句,这个函数的执行结果就是 "生成器"(即函数每一次运行结果在 yield 这停止) 产生数据的方式 1.next()函数 2.使用 生成器.next() 方法 send()方法 send方法有一个参数,指定的是上一次被挂起的yield语句的返回值 相比于.next() 可以额外的给yield 语句 传值。注意第一次调用,要t.send(None) 关闭生成器 生成器.close() 后续如果继续调用, 会抛出StopIteration异常提示 注意:1.碰到return,会直接终止, 抛出StopIteration异常提示 2.生成器只会遍历一次 递归函数 不是一种函数,是指函数的一种调用方式 def jicheng(n):
if n == 1:
return 1
return n * jicheng(n - 1)
res = jicheng(4)
print(res) #24
函数作用域 Python是静态作用域,也就是说在Python中,变量的作用域源于它在代码中的位置; 在不同的位置, 可能有不同的命名空间,有不同的具体的操作范围 LEGB规则 L-Local:函数内的命名空间——当前整个函数体范围 E-Enclosing function locals:外部嵌套函数的命名空间——闭包函数 G-Global:全局命名空间——当前模块(文件) B-Builtin:内建模块命名空间——所有模块(文件) 按照L -> E -> G -> B 的顺序进行查找 变量类型 有全局变量和局部变量,查看局部变量用 locals(),查看全局变量用 globals()。 全局变量和局部变量重名,获取是就近原则,修改是global 全局变量 a = 999 #全局变量
def test():
global a #此处不能用nonlocal,因为它仅仅适用于闭包,不适用于用函数内部改变全局变量
a = 6 #局部变量:这里如果直接使用赋值表达式,其实是代表定义一个新的变量
print(a)
print(a) #999
test() #6
print(a) #6
a = 999
def test():
a = 6
print(a)
print(a) #999
test() #6
print(a) #999
a = 999
def test():
global a
a = 6
print(a)
print(locals()) #此时a是全局变量
print(globals())
test()
6
{}
...(太多了就么有复制)
建议:在进行全局变量命名时,一般命名为 g_xxx(俗称而已)。 文件操作文件打开 open("文件","模式")————模式有四种: r:以只读方式打开文件,文件的指针将会放在文件的开头(文件不存在, 会报错) w:以只写方式打开文件,文件的指针将会放在文件的开头吗,所以, 写入的新内容, 会覆盖旧的内容(文件不存在, 会自动创建一个新文件) a:文件的指针将会放在文件结尾,所以, 写入的内容, 会新增到文件末尾(文件不存在, 会自动创建一个新文件) 增加b:以二进制格式进行操作文件读写(图片,音频,视频这些) # 新建一个xx2照片,它是存在的xxx照片的一半
fromfile = open("xxx.png", "rb")
fromContent = fromfile.read()
print(fromContent)
fromfile.close()
toFile = open("xx2.png","wb")
content = fromContent[0: len(fromContent) // 2]
toFile.write(content)
toFile.close()
增加+:代表都是以 "读写模式" 进行打开 文件的使用流程 定位 seek(偏移量,[0,1,2]):0表示开头,1表示当前位置,2表示末尾 注意:文本文件的操作模式下(不带b)只能写0,如果想要写1/2, 必须在二进制文件操作模式下(带b) 读 read(字节数):字节数默认是文件内容长度,可以自己修改 readline([limit]):读取一行数据,limit是限制的最大字节数 readlines():会自动的将文件按换行符进行处理,将处理好的每一行组成一个列表返回 for in:可以直接遍历 f 本身,也可以遍历行列表 import collections.abc
f = open("s.text", "r")
print(isinstance(f,collections.abc.Iterator))
for i in f:
print(i,end="")
f.close()
True
11
22
33
44
content = f.read()
for i in content:
print(i,end="")
f.close()
11
22
33
44
readable():判断是否可读 写 write("内容"):返回值是写入的字节长度 writeable():判定是否可写 关闭 close():如果不执行这一句,数据会保存在缓冲区,不会立即保存到磁盘文件中 flush():清空缓冲区内容到磁盘文件中 文件的相关操作 此方法都是在os模块中运行,记得每次import os 重命名:os.rename(‘old_name’, 'new_name') ——修改单级目录:目录/文件 名称 os.renames(‘old_name’, 'new_name')——修改多级目录:目录/文件 名称 删除:os.remove('文件名') 创建文件夹:os.mkdir("文件夹名称")——一个 获取当前目录:os.getcwd() 改变默认目录:os.chdir("目标目录") 获取目录列表:os.listdir("./") 返回指定的文件夹包含的文件或文件夹的名字的列表:os.listdir() 判断括号里的文件是否存在的意思:os.path.exists() |
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/3 5:22:13- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |