文章目录
- 一、数据类型和变量
- 二、字符串和编码
- 三、数据结构
- 1.list
- 2.tuple
- 3.dict
- 4.set
- 四、切片
- 五、循环分支
- 六、函数
- 七、迭代
- 八、列表生成式
- 九、生成器
- 十、高阶函数
- 十一、匿名函数
- 十二、面向对象编程
- 十三、文件操作
- 十四、os模块
- 十五、json模块
- 十六、正则表达式
- 十七、datetime
- 十八、collections
- 十九、pillow
- 二十、requests
- 二十一、运算符
一、数据类型和变量
# 1.十六进制表示if 0x10 == 16: print("0x10 == 16") #else: print("0x10 != 16")# 2.下划线数据表示if 100_000_000.5 == 100000000.5: print("100_000_000.5 == 100000000.5") #else: print("100_000_000.5 != 100000000.5")# 3.科学计数法if 1e8 == 100000000: print("1e8 == 100000000") #else: print("1e8 != 100000000")# 4.取消字符串转义print(r"\n \t \0") # \n \t \0# 5.布尔值与逻辑运算print(True and False) # Falseprint(True or False) # Trueprint(not False) # True# 6.空值if (None == 0): print("None == 0")else: print("None != 0") # C中NULL等于0 C++中nullptr也等于0# 7.Python中的所有变量本质上都是指针a = ["a"]b = a # 令b指向a指向的变量a[0] = "b"print(b) # ['b']a = "a"b = aa = "b" # a会指向一个新的变量print(b) # a# 8.地板除print(10 // 3) # 3# 9.Python中的整型可以按照长度动态分配内存 因此理论上没有大小限制print(10**10000 + 1) # 100···001
二、字符串和编码
#!/usr/bin/env python3# -*- coding: utf-8 -*-# 1.字符转换print(ord("\n")) # 10print(ord("风")) # 39118print("\u98ce") # 风 39118D与98ceH相等 \u表示采用Unicode编码# 2.字符串的编码print("北京市".encode("utf-8")) # b'\xe5\x8c\x97\xe4\xba\xac\xe5\xb8\x82' bytesprint(b"\xe5\x8c\x97\xe4\xba\xac\xe5\xb8\x82".decode("utf-8")) # 北京市 strprint(len("北京市")) # 3 统计字符数print(len("北京市".encode("utf-8"))) # 9 统计字节数# 3.格式化字符串print("%dD %f %s %xH" % (17, 1.1, "A", 0x11)) # 17D 1.100000 A 11Hprint("|%-7.3f|" % (12.34)) # |12.340 | 总共7位 小数点后3位 左对齐
三、数据结构
1.list
list可以由方括号或者list()函数初始化:
legends = ["Qiyana", "Vi", "Thresh", "Jinx", "Zed"]print(legends) # ['Qiyana', 'Vi', 'Thresh', 'Jinx', 'Zed']li = list(range(3))print(li) # [0, 1, 2]
list的正向索引和反向索引:
print(legends[0]) # Qiyanaprint(legends[1]) # Viprint(legends[-1]) # Zedprint(legends[-2]) # Jinx
对list中的数据进行增删改查:
legends.append("Viktor")print(legends) # ['Qiyana', 'Vi', 'Thresh', 'Jinx', 'Zed', 'Viktor']legends.insert(1, "Ezreal")print(legends) # ['Qiyana', 'Ezreal', 'Vi', 'Thresh', 'Jinx', 'Zed', 'Viktor']legends.pop()print(legends) # ['Qiyana', 'Ezreal', 'Vi', 'Thresh', 'Jinx', 'Zed']legends.pop(1)print(legends) # ['Qiyana', 'Vi', 'Thresh', 'Jinx', 'Zed']legends.remove("Qiyana")print(legends) # ['Vi', 'Thresh', 'Jinx', 'Zed']legends[-2] = "Pyke"print(legends) # ['Vi', 'Thresh', 'Pyke', 'Zed']print("Thresh" in legends) # Trueprint("Ezreal" not in legends) # True
list中的数据类型也可以不同:
li = ["A", 1, True, legends]print(li) # ['A', 1, True, ['Qiyana', 'Vi', 'Thresh', 'Pyke', 'Zed']]print(li[-1][-1]) # Zedprint(len(li)) # 4
sort()方法可以实现对list的原地排序:
li = [2, 4, 6, 5, 3, 1]li.sort()print(li) # [1, 2, 3, 4, 5, 6]li.sort(reverse=True) # 逆序排序print(li) # [6, 5, 4, 3, 2, 1]li = ["C", "C++", "Python"]li.sort(key=len) # 按长排序print(li) # ['C', 'C++', 'Python']
通过enumerate()函数可以在遍历时跟踪当前序号:
li = ["C", "C++", "Python"]for key, value in enumerate(li): print(key, value)# 0 C# 1 C++# 2 Python
2.tuple
tuple本身是一个长度固定、元素不可变的list:
tup = ("Jinx", "Vi", "Shen") # 括号也可省略print(tup) # ('Jinx', 'Vi', 'Shen')print(tup[0]) # Jinxtup = tuple([1, 2, 3])print(tup) # (1, 2, 3)tup = tuple("string")print(tup) # ('s', 't', 'r', 'i', 'n', 'g')
对于含有单个元素的tuple要通过逗号来消除歧义:
tup = (1)print(type(tup)) # <class 'int'>tup = (1,)print(type(tup)) # <class 'tuple'>
元素不变指的是元素的指向不变而不是指向的内容不变:
tup = ("Jinx", ["Vi", "Shen"])tup[-1][-1] = "Miss Fortune"print(tup) # 'Jinx', ['Vi', 'Miss Fortune'])
对元组进行运算:
tup = (1, True, "str") + (False, "Jinx")print(tup) # (1, True, 'str', False, 'Jinx')tup = (1, True, "str") * 3print(tup) # (1, True, 'str', 1, True, 'str', 1, True, 'str')
如果你想将元组赋值给类似元组的变量,Python会将元组进行拆分:
a, b, (c, d) = (1, 2, (3, 4))print(a, b, c, d) # 1 2 3 4
利用这个特性可以方便地实现两个变量的交换:
a, b = b, aprint(a, b) # 2 1
变量拆分也可以用来迭代元组或列表序列:
for i, j, k in ((1, 2, 3), (4, 5, 6), (7, 8, 9)): print(i, j, k)# 1 2 3# 4 5 6# 7 8 9
count()方法可以用来统计元组中某个值的出现频率:
tup = (1, 0, 0, 8, 6)print(tup.count(0)) # 2
enumerate()函数可以用于在迭代时追踪元素下标:
li = ["Ezreal", "Neeko", "Thresh"]for key, value in enumerate(li): print(key, value)# 0 Ezreal# 1 Neeko# 2 Thresh
3.dict
dict的初始化:
dic = {"C": 1, "C++": 3, "Python": 6}print(dic) # {'C': 1, 'C++': 3, 'Python': 6}
对dict中的数据进行增删改查
dic["C#"] = 2print(dic) # {'C': 1, 'C++': 3, 'Python': 6, 'C#': 2}dic.pop("C++") # dict的pop方法必须传入参数print(dic) # {'C': 1, 'Python': 6, 'C#': 2}del dic["Python"]print(dic) # {'C': 1, 'C#': 2}dic["C"] = -1print(dic) # {'C': -1, 'C#': 2}print(dic["C#"]) # 2print(dic.get("C")) # -1print(dic.get("Java")) # Noneprint("C" in dic) # Trueprint("Java" in dic) # False
获取字典全部的键和值:
print(dic.keys()) # dict_keys(['C', 'C#'])print(dic.values()) # dict_values([-1, 2])
4.set
set的初始化:
s = set([1, 2, 3, 2, 3]) # 重复元素在set中会被自动过滤print(s) # {1, 2, 3}
set的添加和删除:
s.add(4)print(s) # {1, 2, 3, 4}s.remove(4)print(s) # {1, 2, 3}
对set进行集合操作:
s1 = set([1, 2, 3])s2 = set([2, 3, 4])print(s1 & s2) # {2, 3}print(s1.intersection(s2)) # {2, 3}print(s1 | s2) # {1, 2, 3, 4}print(s1.union(s2)) # {1, 2, 3, 4}
四、切片
对list使用切片操作符:
names = ["Sona", "Ezreal", "Vi", "Irelia", "Akali"]print(names[1:3]) # ['Ezreal', 'Vi'] 左闭右开区间print(names[:3]) # ['Sona', 'Ezreal', 'Vi'] 从0开始时0可以省略print(names[1:]) # ['Ezreal', 'Vi', 'Irelia', 'Akali'] 到最后一个截止最后一个也可省略print(names[-3:-1]) # ['Vi', 'Irelia'] 反向切片print(names[0:5:2]) # ['Sona', 'Vi', 'Akali'] 改变切片步长
对tuple和字符串使用切片操作符:
print((0, 1, 2, 3, 4)[1:4]) # (1, 2, 3)print("01234"[1:4]) # 123
五、循环分支
# 1.Python简单循环分支for i in range(5): # <<=>> if i < 2: print("<", end="") elif i == 2: print("=", end="") else: print(">", end="")print()# 2.Python中的for-else结构for i in range(5): pass # 空语句 # breakelse: print("The break statement has been executed.") # 当for循环正常执行完毕时else中的语句就会被执行
六、函数
类型转换函数:
print(int("5")) # 5print(int(5.5)) # 5print(float("5.5")) # 5.5print(float(5)) # 5.0print(str(5)) # 5print(str(5.5)) # 5.5print(bool("")) # Falseprint(bool(1)) # True
Python可以以tuple的形式令一个函数返回多值:
def calculate(a, b): return a + b, a - baddition, subtraction = calculate(1, 2)print(addition, subtraction) # 3 -1print(calculate(1, 2)) # (3, -1)
函数可以有一些位置参数(positional)和一些关键字参数(keyword)。关键字参数通常用于指定默认值或可选参数而且关键字参数必须位于位置参数(如果有的话)之后:
def sum_(a, b = 1): # 位置参数在前 关键字参数在后 return a + bprint(sum_(1)) # 2print(sum_(1, 2)) # 3
默认参数必须指向不可变对象:
def add_end(l=[]): l.append("END") return lprint(add_end()) # ['END']print(add_end()) # ['END', 'END']def add_end(l=None): if l is None: l = [] l.append("END") return lprint(add_end()) # ['END']print(add_end()) # ['END']
可变参数:
def get_sum(*nums): total = 0 for i in nums: total += i return totalprint(get_sum(1, 2, 3)) # 6print(get_sum(*[1, 2, 3])) # 6 通过*可以将list或者tuple中的元素作为可变参数传入
关键字参数:
def person(name, age, **kw): print(name, age, kw)person("Ezreal", 20) # Ezreal 20 {}person("Ezreal", 20, job="ADC", city="Piltover") # Ezreal 20 {'job': 'ADC', 'city': 'Piltover'}def person_(name, age, *, job, city): # 命名关键字参数 print(name, age, job, city)person_("Ezreal", 20, job="ADC", city="Piltover") # Ezreal 20 ADC Piltover
利用递归函数解决汉诺塔问题:
def hanoi(n, a, b, c): if n == 1: print(a, "->", c, sep="") else: hanoi(n - 1, a, c, b) print(a, "->", c, sep="") hanoi(n - 1, b, a, c)hanoi(3, "a", "b", "c") # a->c a->b c->b a->c b->a b->c a->c
七、迭代
# 1.对dict进行迭代dict = {"C": 1, "C++": 3, "Python": 6}for i in dict: print(i) # C C++ Pythonfor i in dict.values(): print(i) # 1 3 6for i in dict.items(): print(i) # ('C', 1) ('C++', 3) ('Python', 6)for i, j in dict.items(): print(i, j) # C 1 C++ 3 Python 6# 2.判断一个类型是否可迭代from collections.abc import Iterableprint(isinstance("string", Iterable)) # Trueprint(isinstance([(1, 2), (3, 4), (5, 6)], Iterable)) # Trueprint(isinstance(2022, Iterable)) # False
八、列表生成式
# 1.使用列表生成式创建列表L = list(x * x for x in range(5))print(L) # [0, 1, 4, 9, 16]L = list(x for x in range(1, 6) if x % 2 == 0)print(L) # [2, 4]L = list(x if x % 2 == 0 else 0 for x in range(1, 6))print(L) # [0, 2, 0, 4, 0]# 2.使用列表生成式获取当前目录下的文件和目录名import osL = list(i for i in os.listdir("."))print(L) # ['.DS_Store', 'venv', 'demo.html', 'main.py', '.idea']
九、生成器
一个带有yield的函数就是一个generator,它和普通函数不同,生成一个generator的过程看起来像是函数调用,但不会执行任何函数代码,直到对其调用next()才开始执行(在 for 循环中会自动调用)。虽然执行流程仍按函数的流程执行,但每执行到一个yield语句就会中断并返回一个迭代值,下次执行时从yield的下一个语句继续执行。
这看起来就好像一个函数在正常执行的过程中被yield中断了数次,每次中断都会通过yield返回当前的迭代值。
# 1.使用generator生成斐波那契数列def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1for i in fib(5): print(i) # 1 1 2 3 5# 2.使用generator生成杨辉三角def triangles(): ans = [] n = 0 while True: line = [] for i in range(n + 1): if i == 0 or i == n: line.append(1) else: line.append(ans[n - 1][i - 1] + ans[n - 1][i]) yield line n = n + 1 ans.append(line)n = 0for i in triangles(): print(i) n = n + 1 if n == 10: break# [1]# [1, 1]# [1, 2, 1]# [1, 3, 3, 1]# [1, 4, 6, 4, 1]# [1, 5, 10, 10, 5, 1]# [1, 6, 15, 20, 15, 6, 1]# [1, 7, 21, 35, 35, 21, 7, 1]# [1, 8, 28, 56, 70, 56, 28, 8, 1]# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
十、高阶函数
# 1.普通高阶函数def abs_sum(x, y, fun): # 类似于函数指针 return fun(x) + fun(y)print(abs_sum(-1, 1, abs)) # 2# 2.通过map求列表中所有元素的平方def square(x): return x * xprint(list(map(square, [0, 1, 2]))) # [0, 1, 4] map将传入的函数依次作用到序列的每个元素# 3.通过reduce将列表转化为整数from functools import reducedef add(x, y): return x * 10 + yprint(reduce(add, [1, 2, 3])) # 123 reduce把结果继续和序列的下一个元素做累积计算# 4.通过filter过滤出列表中的所有奇数def is_odd(x): return x % 2 == 1print(list(filter(is_odd, [1, 2, 3, 4, 5]))) # [1, 3, 5] filter把传入的函数依次作用于每个元素后根据返回值是True还是False决定保留还是丢弃该元素# 5.通过sorted对列表按绝对值进行逆向排序print(sorted([1, -2, 3, -4, 5], key=abs, reverse=True)) # [5, -4, 3, -2, 1]
十一、匿名函数
# 1.通过匿名函数筛选奇数print(list(filter(lambda n: n % 2 == 1, range(1, 10))))
十二、面向对象编程
# 1.Python简单面向对象class Legend(object): def __init__(self, name, camp): self.__name = name # 通过两个下划线将变量变为私有变量 self.__camp = camp def __str__(self): return "%s: %s" % (self.__name, self.__camp)Ezreal = Legend("Ezreal", "Piltover")print(Ezreal) # Ezreal: Piltoverclass MID(Legend): # MID继承自Legend passZoe = MID("Zoe", "MountTargon")print(Zoe) # Zoe: MountTargonprint(type(Ezreal)) # <class '__main__.Legend'>print(type(Zoe)) # <class '__main__.MID'>print(isinstance(Zoe, Legend)) # Trueprint(isinstance(Zoe, MID)) # True# 2.通过类属性和实例属性统计实例数class Brand(object): count = 0 def __init__(self, name): self.__name = name Brand.count = Brand.count + 1Uni = Brand("Uni")Sakura = Brand("Sakura")Pilot = Brand("Pilot")print(Brand.count) # 3# 3.通过类实现斐波那契数列class Fib(object): def __init__(self, n): self.__a, self.__b = 0, 1 self.__n = n def __iter__(self): return self def __next__(self): self.__a, self.__b = self.__b, self.__a + self.__b if self.__a > self.__n: raise StopIteration return self.__afor i in Fib(10): print(i) # 1 1 2 3 5 8# 4.枚举类from enum import EnumMonth = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))print(Month.Jan.value) # 1print(Month.Nov.value) # 11
十三、文件操作
# 文件打开try: my_file = open("./main.py", "r")except FileNotFoundError as e: print("FileNotFoundError:", e)finally: pass# 文件读写try: print(my_file.read()) my_file.write("#")except IOError as e: print("IOError:", e)finally: pass# 文件关闭my_file.close()
十四、os模块
import os# 1.获取操作系统信息print(os.name) # posixprint(os.uname()) # posix.uname_result(sysname='Darwin', nodename='AtreusdeMBP', release='21.4.0', version='Darwin Kernel Version 21.4.0: Fri Mar 18 00:46:32 PDT 2022; root:xnu-8020.101.4~15/RELEASE_ARM64_T6000', machine='arm64')# 2.操作文件和目录print(os.path.abspath(".")) # /Users/atreus/PycharmProjects/pythonProjectprint(os.path.join("./", "test_dir")) # ./test_diros.mkdir("./test_dir") # 创建目录os.rmdir("./test_dir") # 删除目录
十五、json模块
import json# 1.使用json对dict进行序列化languages = {"C": 1, "C++": 3, "Python": 6}print(json.dumps(languages)) # {"C": 1, "C++": 3, "Python": 6}# 2.使用json对list进行序列化legends = ["Ezreal", "Vi", "Jinx"]print(json.dumps(legends)) # ["Ezreal", "Vi", "Jinx"]# 3.使用json进行反序列化json_str = '{"C": 1, "C++": 3, "Python": 6}'languages_dict = json.loads(json_str)print(languages_dict["C++"]) # 3# 4.使用json对对象进行序列化和反序列化class Legend(object): def __init__(self, name, camp): self.name = name self.camp = campdef to_dict(legend): return { "name": legend.name, "camp": legend.camp }Ezreal = Legend("Ezreal", "Piltover")print(json.dumps(Ezreal, default=to_dict)) # {"name": "Ezreal", "camp": "Piltover"}def to_legend(json_dict): return Legend(json_dict["name"], json_dict["camp"])print(json.loads('{"name": "Jinx", "camp": "Zaun"}', object_hook=to_legend)) # <__main__.Legend object at 0x104def100>
十六、正则表达式
import re# 1.matchprint(re.match(r"^\d{3}\-\d{3,8}$", "010-10010")) # <re.Match object; span=(0, 9), match='010-10010'>print(re.match(r"^\d{3}\-\d{3,8}$", "010 10010")) # Noneans = re.match(r"^(\d{3})\-(\d{3,8})$", "010-10010")print(ans.group(0)) # 010-10010print(ans.group(1)) # 010print(ans.group(2)) # 10010print(re.match(r"^(\d+)(0*)$", "12300").groups()) # ('12300', '') 贪婪匹配print(re.match(r"^(\d+?)(0*)$", "12300").groups()) # ('123', '00') 非贪婪匹配# 2.splitprint(re.split(r"\s+", "a b c d e")) # ['a', 'b', 'c', 'd', 'e']
十七、datetime
# 1.datetimefrom datetime import datetimeprint(datetime.now()) # 2022-05-10 10:16:41.384150print(datetime(2021, 12, 25, 8, 0)) # 2021-12-25 08:00:00print(datetime(1970, 1, 1, 8, 0).timestamp()) # 0.0print(datetime.fromtimestamp(0.0)) # 1970-01-01 08:00:00print(datetime.now().strftime("%a, %b %d, %H:%M")) # Tue, May 10, 10:24
十八、collections
# 1.namedtuplefrom collections import namedtuplePoint = namedtuple("Point", ["x", "y"]) # 将元组定义为一个坐标point = Point(1, 0)print(point.x, point.y) # 1 0Circle = namedtuple("Circle", ["x", "y", "r"]) # 将元组定义为一个圆circle = Circle(0, 0, 1)print(circle) # Circle(x=0, y=0, r=1)# 2.dequefrom collections import dequeL = deque([1, 2, 3, 4, 5]) # 双向链表print(L) # deque([1, 2, 3, 4, 5])L.append(6)print(L) # deque([1, 2, 3, 4, 5, 6])L.appendleft(0)print(L) # deque([0, 1, 2, 3, 4, 5, 6])L.pop()print(L) # deque([0, 1, 2, 3, 4, 5])L.popleft()print(L) # deque([1, 2, 3, 4, 5])# 3.OrderedDictfrom collections import OrderedDictorder_dict = OrderedDict([("C", 1), ("C++", 3), ("Python", 6)]) # OrderedDict的Key会按照插入的顺序而不是Key本身排序print(order_dict) # OrderedDict([('C', 1), ('C++', 3), ('Python', 6)])print(list(order_dict.keys())) # ['C', 'C++', 'Python']# 4.Counterfrom collections import Countercounter = Counter()for i in "Ezreal": # 通过循环更新计数器 counter[i] += 1print(counter) # Counter({'E': 1, 'z': 1, 'r': 1, 'e': 1, 'a': 1, 'l': 1})counter.update("EZ") # 一次性更新计数器print(counter) # Counter({'E': 2, 'z': 1, 'r': 1, 'e': 1, 'a': 1, 'l': 1, 'Z': 1})
十九、pillow
# 1.利用pillow生成验证码from PIL import Image, ImageDraw, ImageFont, ImageFilterimport random# 随机字母def rand_char(): return chr(random.randint(65, 90))# 随机颜色def rand_color(): return random.randint(64, 255), random.randint(64, 255), random.randint(64, 255)def back_rand_color(): return random.randint(32, 127), random.randint(32, 127), random.randint(32, 127)# 创建Image对象width = 60 * 4height = 60image = Image.new("RGB", (width, height), (255, 255, 255))# 创建Font对象font = ImageFont.truetype("Arial.ttf", 36)# 创建Draw对象draw = ImageDraw.Draw(image)# 填充每个像素for x in range(width): for y in range(height): draw.point((x, y), fill=rand_color())# 输出文字for t in range(4): draw.text((60 * t + 10, 10), rand_char(), font=font, fill=back_rand_color())# 保存图片image.save("./code.jpg", "jpeg")
二十、requests
# 1.通过requests访问网页import requestsr = requests.get("https://www.liaoxuefeng.com/")print(r.status_code) # 200print(r.text[0: 15]) # <!DOCTYPE html>