Python¶
约 3505 个字 208 行代码 预计阅读时间 20 分钟
Abstract
这是我在学习 "CS50P Introduction to Programming with Python" 时所做的笔记 (这里指路B站链接🔗) ,难免不全。笔者之后有计划继续进一步学习python,因此仍会更新。
print and main¶
- print函数:输出多个对象,并且可以自定义分隔符、结束符等
- 格式化字符串:将变量插入字符串中,使用f开头,大括号中插入变量名
- 判断当前脚本是否为主程序执行
change string¶
- chars(可选):指定要移除的字符集,如果不指定,则默认移除空白字符。
- 将字符串的首字母大写
- 将字符串全部转换为大写
- 将字符串全部转换为小写
-
按指定字符拆分字符串,返回列表。
-
separator(可选):指定分隔符,如果不指定,任何空白字符(空格、制表符、换行符等)都会被视为分隔符。
-
maxsplit(可选):指定最大拆分次数,分割后的子字符串数量不会超过 maxsplit。如果不指定,则分割所有可能的地方。
print numbers¶
-
格式化输出数字,添加千位分隔符。
-
例如,如果z的值是1234567,那么格式化后的字符串将是"1,234,567"。
- 格式化输出数字,保留两位小数
- 格式化输出数字,添加千位分隔符并保留两位小数
-
对数字进行四舍五入。
-
number:需要四舍五入的数字。
-
ndigits(可选):指定小数点后保留的位数。如果不提供这个参数,函数将返回最接近的整数。
match¶
match name:
case "Alice":
print("Hello, Alice!")
case "Bob":
print("Hello, Bob!")
case _:
print("Hello, stranger!")
- 有点类似 C 里面的
switch-case
语句
random¶
Info
要使用以下函数,需要 import random
- 生成一个1到10之间的随机整数
- 生成一个0到1之间的随机浮点数
- 生成一个1到10之间的随机浮点数
- 从列表中随机选择一个元素
- 随机打乱列表中的元素
statistics¶
Info
要使用以下函数,需要 import statistics
- 计算列表中元素的均值
- 计算列表中元素的中位数
- 计算列表中元素的众数
- 计算列表中元素的标准差
sys¶
Info
要使用以下函数,需要 import sys
sys
:用于与Python解释器交互,提供命令行参数处理、程序退出等功能。
- 输出命令行参数
- 输出第一个命令行参数,通常是脚本名称
- 输出命令行参数中的中间部分
- 退出程序,并输出指定的消息
cowsay¶
Info
要使用以下函数,需要 import cowsay
- 使用cowsay打印一个牛说的“Hello, world!”
- 使用cowsay打印一个恐龙说的“Hello, world!”
requests and json¶
Info
要使用以下函数,需要 import requests
和 import json
- requests.get 方法通过构造一个 HTTP GET 请求,向指定的 URL 发送请求,并返回一个 Response 对象。这个对象包含了服务器响应的所有信息,如状态码、响应头、响应体等。
- 打印响应的状态码
Note
在HTTP协议中,状态码是一个三位数的整数,用于表示服务器对请求的处理结果。状态码分为五大类,分别是:
-
1xx(信息性状态码):表示请求已接收,继续处理。
-
2xx(成功状态码):表示请求已成功接收、理解和接受。
-
3xx(重定向状态码):表示需要客户端采取进一步操作才能完成请求。
-
4xx(客户端错误状态码):表示请求包含语法错误或无法被执行。
-
5xx(服务器错误状态码):表示服务器在处理请求的过程中发生了错误。
- 打印响应的内容。上述的
response.content
是HTTP响应对象的一个属性,它包含了服务器返回的实际内容。这个内容是以字节形式存储的。
- 打印响应的头部信息。上述的
response.headers
是HTTP响应对象的一个属性,它包含了服务器返回的所有头部信息。这些信息是以字典形式存储的,可以通过键值对的方式访问。
Note
HTTP头部信息是HTTP协议的一部分,用于在客户端和服务器之间传递额外的信息。这些信息包括请求和响应的元数据,如内容类型、内容长度、服务器类型等。
- 打印响应的JSON数据,
.json()
方法将响应的内容解析为Python的字典或列表,具体取决于JSON数据的结构。
-
json.dumps
函数将Python对象转换为JSON格式的字符串。 -
indent=4
参数指定了输出的字符串应该使用4个空格进行缩进,使得输出的JSON字符串更加易读。
assert¶
- 断言1等于2,如果不等则抛出异常并打印消息。
Info
assert
语句通常用于开发和测试阶段,用于检查代码中的假设是否成立。如果假设不成立,程序会立即停止执行,并给出错误信息,帮助开发者快速定位问题。
file I/O¶
- 写入文件(会覆盖原文件内容)
with open("file.txt", "a") as f:
f.write("Hello, world!")
# or
name = input("Enter your name: ")
f.write(f"{name}\n")
- 写入文件(会追加内容到文件末尾)
with open("file.txt", "r") as f:
content = f.readlines()
# or
for line in f:
print(line, end="")
# or 去除每行末尾的换行符
print(line,rstrip())
- 读取文件内容
-
排序文件中的内容
-
sorted(iterable, key=None, reverse=False)
iterable
:要排序的可迭代对象,如列表、元组、字典等。key
:一个函数,用于从每个元素中提取比较键。默认为 None,表示直接对元素进行排序。reverse
:如果设置为 True ,则降序排序。如果设置为 False ,则列表元素将被升序排序。默认为 False 。
further for key
key
可以是一个函数,也可以是一个可调用对象。如果 key
是一个函数,那么它将被应用于每个元素,并返回一个用于排序的键。如果 key
是一个可调用对象,那么它将被应用于每个元素,并返回一个用于排序的键。
-
如果
key
是一个函数,那么它将被应用于每个元素,并返回一个用于排序的键。例如,如果key
是一个函数,它接受一个字符串作为参数,并返回字符串的长度,那么sorted
函数将根据字符串的长度对字符串进行排序。 -
如果
key
是一个可调用对象,那么它将被应用于每个元素,并返回一个用于排序的键。例如,sorted_people = sorted(people, key=lambda person: person["age"])
将根据每个人的年龄对people
列表进行排序。
这个 lambda
函数是一个匿名函数。 lambda arguments: expression
。
- `arguments` : 是一个或多个参数,用逗号分隔。
- `expression` : 函数的表达式,这个表达式的结果就是函数的返回值。
Note
with
语句用于管理文件的上下文,当 with
语句块结束时,无论是否发生异常,文件对象都会被正确关闭。
csv¶
Info
要使用以下函数,需要 import csv
。
Note
csv
模块用于读写 CSV(Comma-Separated Values,逗号分隔值)文件。CSV 文件是一种常见的文本文件格式,用于存储表格数据。每行数据由多个字段组成,字段之间用逗号分隔。
- 读取CSV文件,自动识别分隔符
- 读取CSV文件,第一行是列名
with open("file.csv", "a", newline="") as f:
writer = csv.writer(f)
writer.writerow(["Name", "Age", "City"])
- 写入CSV文件,指定列名
re¶
Info
要使用以下函数,需要 import re
。
Note
re
模块用于在字符串中搜索和替换模式。它提供了正则表达式操作的各种函数,如搜索、匹配、替换等。
-
用于在给定的字符串中搜索与正则表达式模式匹配的第一个位置。如果找到匹配项,则返回一个匹配对象;如果没有找到匹配项,则返回 None。
-
pattern
: 正则表达式模式,用于匹配字符串中的内容。 -
string
: 要搜索的字符串。 -
flags
: 可选参数,用于修改正则表达式的匹配行为。默认值为 0,表示不使用任何标志。
about pattern
"." 匹配除换行符以外的任意字符 "^" 匹配字符串的开头 "$" 匹配字符串的结尾 "*" 匹配前面的子表达式零次或多次 "+" 匹配前面的子表达式一次或多次 "?" 匹配前面的子表达式零次或一次 "{n}" 匹配前面的子表达式n次 "{n,}" 匹配前面的子表达式至少n次 "{n,m}" 匹配前面的子表达式至少n次,至多m次 "[...]" 匹配方括号内的任意一个字符 "[^...]" 匹配不在方括号内的任意一个字符 "\d" 匹配一个数字字符 "\D" 匹配一个非数字字符 "\s" 匹配一个空白字符 "\S" 匹配一个非空白字符 "\w" 匹配一个字母或数字字符 "\W" 匹配一个非字母或数字字符 "(A|B)" 匹配A或B "()" 匹配括号内的表达式
about flags
re.I
| re.IGNORECASE
忽略大小写
re.M
| re.MULTILINE
多行模式,改变 ^
和 $
的行为, ^
和 $
可以匹配每行的开始和结束)
re.S
默认情况下,.
字符在正则表达式中匹配除换行符以外的任何字符。使用 re.S
| re.DOTALL
可使 .
字符将匹配任何字符,包括换行符。
example¶
-
r
表示字符串是原始字符串,不会对反斜杠进行转义,也即不需要解释器再次进行转义。 -
\.edu
表示匹配字符.edu
。由于.
在正则表达式中是一个特殊字符,表示任意字符,所以需要用\
进行转义,表示匹配字符.
。 -
这段代码的用途是检查一个给定的电子邮件地址是否包含
@
符号,并且域名部分是否以.edu
结尾。
matches = re.research(r"^(.+), (.+)$", name)
if matches:
last, first = matches.groups()
print(f"Last name: {last}, First name: {first}")
# or
if matches:
last = matches.group(1)
first = matches.group(2)
print(f"Last name: {last}, First name: {first}")
-
^
匹配字符串的开始位置 -
(.+)
匹配一个或多个任意字符,并将其捕获为一个组 -
,
匹配一个逗号和一个空格 -
(.+)
匹配一个或多个任意字符,并将其捕获为另一个组 -
$
匹配字符串的结束位置 -
matches.groups()
返回一个包含所有捕获组的元组,元组中的每个元素对应于一个捕获组。在这个例子中,matches.groups()
返回一个包含两个元素的元组,第一个元素是last
,第二个元素是first
。
url = input("Enter URL: ").strip()
username = url.replace("http://", "")
# or
username = url.removeprefix("http://")
username = re.sub(r"^(https?://)?(www\.)?twitter\.com/", "", url)
# attention: group(0) is the whole match and group(1) is the first group (www\.)
matches = re.search(r"https?://(www\.)?twitter\.com/(.+)", url,re.IGNORECASE).group(2)
- 找出
url
中的twitter
用户名,忽略大小写
Note
re.sub(pattern, repl, string, count=0, flags=0)
-
pattern
:正则表达式模式,用于匹配要替换的子串。 -
repl
:替换字符串,用于替换匹配到的子串。 -
string
:要搜索和替换的原始字符串。 -
count
:可选参数,指定替换的最大次数。默认为 0,表示替换所有匹配的子串。 -
flags
:可选参数,用于修改正则表达式的匹配行为。例如,re.IGNORECASE
表示忽略大小写。
class¶
Info
还没整理完,待续。估计会等到 cpp 整理完再整理。(咕咕咕)
class Student:
def __init__(self, name, house=None):
# 如果 house 没有传入值,则默认为 None
if not name:
raise ValueError("Name is required")
self.name = name
self.house = house
def __str__(self):
return f"{self.name} from {self.house}"
@property
def house(self):
return self._house
@house.setter
def house(self, value):
if not value:
raise ValueError("House is required")
self._house = value
set¶
- 创建集合,如果集合中有重复的元素,则只会保留一个。
Note
集合是无序的,不能通过索引访问元素。集合的元素必须是不可变类型(如整数、浮点数、字符串、元组等),不能是列表、字典或集合等可变类型。
-
add()
方法用于向集合中添加元素。 -
remove()
方法用于从集合中删除元素。如果元素不存在,则会引发KeyError
异常。
numbers1 = {1, 2, 3}
numbers2 = {2, 3, 4}
intersection = numbers1 & numbers2
union = numbers1 | numbers2
difference = numbers1 - numbers2
-
&
运算符用于计算两个集合的交集。 -
|
运算符用于计算两个集合的并集。 -
-
运算符用于计算两个集合的差集。
argparse¶
Info
要使用以下函数,需要 import argparse
。
- 创建ArgumentParser对象
parser.add_argument('input_file', type=str, help='输入文件的路径')
parser.add_argument('-o', '--output_file', type=str, default='output.txt', help='输出文件的路径')
parser.add_argument('-n', '--number', type=int, default=10, help='要处理的数量')
- 添加参数,
add_argument()
方法用于添加命令行参数。参数的名称、类型和默认值都可以指定。
- 解析命令行参数,将结果存储在
args
对象中。
- 使用
args
对象的属性访问命令行参数的值,并打印出来。
example
import argparse
parser = argparse.ArgumentParser(description="这是一个示例脚本")
parser.add_argument('input_file', type=str, help='输入文件的路径')
parser.add_argument('-o', '--output_file', type=str, default='output.txt', help='输出文件的路径')
parser.add_argument('-n', '--number', type=int, default=10, help='要处理的数量')
args = parser.parse_args()
print(f"Name: {args.name}, Age: {args.age}")
you can see them by typing --help
此时会出现
unpacking¶
Note
unpacking 是指将一个可迭代对象(如列表、元组、字典等)中的元素解包为多个变量。*
运算符用于将列表或元组中的元素解包为函数的参数。
def totall(yuan, jiao, fen):
total = yuan * 100 + jiao * 10 + fen
coins = [1, 1, 1]
print(totall(*coins))
- 使用解包操作符
*
将coins
列表的元素作为参数传递给totall
函数。如果传递给函数的参数数量不匹配,Python 会抛出一个TypeError
异常,并显示一条错误消息。
- 使用解包操作符
**
将package
字典中的键值对作为关键字参数传递给totall
函数。
- 示例结果:
-
*args
:用于将可变数量的位置参数传递给函数。args
是一个元组,包含所有传递给函数的位置参数。 -
**kwargs
:用于将可变数量的关键字参数传递给函数。kwargs
是一个字典,包含所有传递给函数的关键字参数。
Attention
*args
和 **kwargs
可以同时使用,但 *args
必须在 **kwargs
之前,否则会引发语法错误。
map¶
map()
:接受两个参数:一个函数和一个序列。函数用于处理序列中的每个元素,并返回一个新的序列。
filter¶
filter()
:接受两个参数:一个函数和一个序列。函数用于测试序列中的每个元素,如果函数返回 True,则该元素会被包含在结果中。
enumerate¶
enmuerate(iterable, start)
函数用于遍历序列,并返回每个元素的索引和值。其中,iterable
是要遍历的序列,start
是索引的起始值,默认为 0。
yield¶
def countdown(n):
while n > 0:
yield n
n -= 1
for i in countdown(5):
print(i)
# or
gen = countdown(5)
while True:
try:
print(next(gen))
except StopIteration:
break
Note
If it is return, when the n is too large, it will cause memory error.
If it is yield, it will not cause memory error.
它会给一个输出再给一个输出,而不是一次性输出
pyttsx3¶
Info
要使用以下函数,需要 import pyttsx3
。
Note
pyttsx3
是一个用于将文本转换为语音的 Python 库。
- 初始化语音引擎
- 设置语速
- 设置音量
- 让引擎发出语音