目录
进程之间不共享变量:全局变量在多个进程中不共享:进程之间的数据是独立的,默认情况下互不影响
一、列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
列表生成式的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。列表表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以if和for语句为上下文的表达式运行完成之后产生。
list1 =[]
for i in range(1,11):
list1.append(i*i)
print(list1)
二、生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器
from collections.abc import Iterator
list1 = [x for x in range(1, 1111)]
print(list1)
list2 = (x for x in range(1, 1111))
print(list2)
print(f"生成器list2是否是迭代器:{isinstance(list2, Iterator)}")
print(next(list2))
三、字节流
在Python中,读取字节流文件有两种主要方式:
1. 分段读取:每次读取一定数量的字节,处理一部分后,再继续读取。这种方式通常用于较大的文件或一个文件被重复读取时。
2. 一次读取全部字节:通常出现在字节数较少的情况下。
为了通过字节数来进行文件的读取,我们主要使用read()函数,但需要借助open()函数以可读模式打开,随后再调用read()函数进行字节读取。需要注意的是,操作文件结束后,需要使用close()函数手动关闭文件,以避免不必要的错误。
f = open("test.txt", "rb") # b:字节
msg = f.read()
print(msg)
print(msg.decode()) # 转换成字符
四、python链接msql
MySQL是Web世界中使用最广泛的数据库服务器。SQLite的特点是轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用。而MySQL是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也远远大于SQLite。
此外,MySQL内部有多种数据库引擎,最常用的引擎是支持数据库事务的InnoDB。
msql:使用方法如下:
from pymysql import Connection
conn=Connection(
host = "localhost",
port = 3306,
user ="root",
password = "123456"
)
print(dir(conn))
print(conn.get_server_info())
conn.close
#选择操作的数据库
conn.select_db("数据库名")
#创建游标
cur = conn.cursor()
#print(dir(cur))
#执行sql语句
#cur.exectue("create table student (uname varchar(20),age int,tel int)")
cur.execute("insert into student (uname, age ,tel ) values('刘德华',61,110),")
conn.commit()
cur.execute("selete*fron student where age > 60;")
t2 =cur.fetchal
五、多进程
主进程与子进程:
程序执行就是一个进程
主程序(就是主进程)中可以包含很多的其他进程。在主进程中添加了子进程,这样每个子进程可以在不同的gpu上跑,就可以实现并行。如果不加多进程,那么只能单进程运行,速度很慢。
可能子进程的函数还没有跑完,可是主进程中已经完了。(比如子进程中有sleep方法)。
由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing
模块就是跨平台版本的多进程模块。multiprocessing
模块提供了一个Process
类来代表一个进程对象
import Process
import multiprocessing
import os
创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process
实例,用start()
方法启动
def test2():
for i in range(4):
print("2222")
time.sleep(3)
print(f"子进程test2的编号是:{os.getpid()}")
if __name__ =='__main__' :
test2_process = multiprocessing.Process(target=test2)
test2_process.start()
进程之间不共享变量:全局变量在多个进程中不共享:进程之间的数据是独立的,默认情况下互不影响
六、正则表达式
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
字符 | 描述意思 |
---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
[^ABC] | 匹配除了 [...] 中字符的所有字符 |
[A-Z] | A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 |
\w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
\W | 匹配非字母、数字、下划线。 |
( ) | 标记一个子表达式的开始和结束位置。 |
所以我们判断一个字符串是否是合法的Email的方法是:
-
创建一个匹配Email的正则表达式;
-
用该正则表达式去匹配用户的输入来判断是否合法。
最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
七、re模板
当我们在Python中使用正则表达式时,re模块内部会干两件事情:
-
编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
-
用编译后的正则表达式去匹配字符串。
import re
a = re.match(r".+", "nhjc")
print(a)
b = re.findall(r"a", "nhjc")
print(b)
'''
iter=re.finditer(r"a","nhjc")
print(iter)
print(next(iter))
print(next(iter))
'''
str1 = "<a>item1</a><a>item2</a>"
a = re.match(r"<([a-z]+)>.*</\1>", str1)
print(a)