当前位置:首页>python>笔记:python高级(实用工具+高阶技巧)

笔记:python高级(实用工具+高阶技巧)

  • 2026-09-04 23:10:45
笔记:python高级(实用工具+高阶技巧)

一,基础工具

1生成随机整数(指定范围内)

import random

生成一个1到100之间的随机整数(包括100)

random_int = random.randint(1, 100)
Python

2输出不换行技巧

#输出换行
print("hello")
print("world")
#输出不换行
print("hello",end='')
print("world",end='')
Python

3制表符\t

\t可以使我们的多行字符串进行对齐
print("hello world")
print("itheima best")
print("hello\tworld")
print("itheima\tbest")
Python

4查看搜索.py模块

Ctrl+鼠标点击名称进入模块内部
Ctrl+F进行搜索

5代码换行 \

可以把长代码进行分行书写
rdd_read=sc.textFile("D:\search_log.txt")
restult1=rdd_read.map(lambda x:(x.split("\t")[0][:2],1)).\
reduceByKey(lambda a,b:a+b).\
sortBy(lambda x:x[1],ascending=False,numPartitions=1).\
take(3)
print("需求一的结果是:",restult1)
Python

6判读文件

import os
print(os.listdir("D:/test"))#列出目录下的所有文件

print(os.path.isdir("D:/test"))#判断是否是文件夹

print(os.path.exists("D:/test"))#判断文件是否存在
Python

二,高阶方法

1闭包

定义:在函数嵌套的前提下,内部函数使用外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称之为闭包

1.1基础使用

defouter(logo):
definner(msg):
print(f"<{logo}>{msg}<{logo}>")
return inner
fn1=outer("*")
fn1("shanxi")
fn2=outer("-")
fn2("taiyuan")
Python
作用:内层依赖的外部变量不会被随意修改,既完成了全局变量的作用,又可以避免被外部改动

1.2修改外部变量的值 nonlocal

defouter(num1):
definner(num2):
num1+=num2
print(num1)
return  inner
fn=outer(10)
fn(10)
fn(10)
fn(10)
Python
这样会发生报错,不可修改外部变量
添加关键词nonlocal
defouter(num1):
definner(num2):
nonlocal num1
num1+=num2
print(num1)
return  inner
fn=outer(10)
fn(10)
fn(10)
fn(10)
Python

1.3案例:atm机

defaccount_outer(initial_count=0):
defatm(num,deposit=True):
nonlocal initial_count
if deposit:
initial_count += num
print(f"存款{num}账户余额为:{initial_count}")
else:
initial_count -= num
print(f"取款{num}账户余额为:{initial_count}")
return atm
atm1 = account_outer()
atm1(100)
atm1(50)
atm1(100,False)
Python

2装饰器

为函数增加功能,但不破坏函数本身

2.1一般写法(闭包写法)

defouter(func):
definner():
print("我要睡觉了")
func()
print("我睡醒了")
return inner
defsleeep():
import time
import random
print("开始休眠..........")
time.sleep(random.randint(1, 5))
fn=outer(sleeep)
fn()
Python

2.2语法糖写法@

defouter(func):
definner():
print("我要睡觉了")
func()
print("我睡醒了")
return inner
@outer
defsleeep():
import time
import random
print("开始休眠..........")
time.sleep(random.randint(1, 5))
sleeep()
Python

3设计模式

设计模式是一种编程套路,可以极大的方便程序的开发
最常见最经典的设计模式就是面向对象,除此之外有单例,工厂,建造者等模式

3.1单例模式

创建类的实例后,就可以得到一个完整的,独立的类对象
在某些场景下,我们需要一个类无论获得多少次类对象,都仅仅提供一个具体实例,用于节省创建类对象的开销和内存开销
比如工具类,仅需要一个实例,即可在各处使用
单例模式定义:保证一个类只有一个实例,并提供一个访问它的全局访问点
操作方式
1现在一个文件中定义工具如test2
classstrTools:
pass
str_tool=strTools()
Python
在文件中直接使用即可使用
from test2 import str_tool
s1=str_tool
s2=str_tool
print(s1)
print(s2)
Python
这样就不会重复占用内存,输出的结果相同

3.2工厂模式

大量创建一个类的实例时,基于工厂提供的方法进行创建子类
优点
1.大批量创建对象时候有统一的入口,易于代码维护。
2.当发生修改时,仅修改工厂类的创建方法即可。
3.符合现实世界模式,由工厂制作产品(对象)
classPerson:
pass
classWorker(Person):
pass
classStudent(Person):
pass
classTeacher(Person):
pass
classPersonFactory:
defcreate_person(self, type):
iftype == 'w':
return Worker()
eliftype == 's':
return Student()
eliftype == 't':
return Teacher()
else:
return Person()
pf=PersonFactory()
worker=pf.create_person('w')
student=pf.create_person('s')
teacher=pf.create_person('t')
Python

4多线程

4.1进程,线程

定义:
进程:一个运行在程序之上的系统,称这个程序为一个运行进程,进行分配ID方便管理(项目组)
线程:属于进程,是进程实际最小工作单元(员工)
操作系统中可以有多个进程,即多任务运行
一个进程可以运行多个线程,即多线程运行

4.2并行执行

同一时间做不同工作。
操作系统统一运行多个程序→并行执行
一个程序同一时间做多件事→并行执行

4.3多线程编程 threading

语法:

带上“,”才是元组,否则不是

import time
import threading
defsing():
whileTrue:
print("正在唱歌...")
time.sleep(1)
defdance():
whileTrue:
print("正在跳舞...")
time.sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
Python
当需要传参时
import time
import threading
defsing(msg):
whileTrue:
print(msg)
time.sleep(1)
defdance(msg):
whileTrue:
print(msg)
time.sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=sing,args=("我在唱歌......",))
t2 = threading.Thread(target=dance,kwargs={"msg":"我在跳舞....."})
t1.start()
t2.start()
Python

5网络编程

socket:

5.1服务端开发

(1)基础单次运行
import socket
#创建socket对象
socket_server=socket.socket()
#绑定ip和端口
socket_server.bind(("localhost",8888))
#监听端口
socket_server.listen(1)
#listen方法内部接受一个整数参数,表示接受的连接数量
#等待客户端连接
conn,address=socket_server.accept()
#accept方法返回一个元组,包含两个元素,

第一个元素是连接对象,第二个元素是地址

#accept是阻塞方法,等待客户端连接,如果没有连接则停止不执行
print(f"接收到了客户端的连接,客户端的地址是:{address}")
#接收客户端信息,要使用客户端与本次的连接对象conn
data:str=conn.recv(1024).decode("utf-8")
#recv接受的参数是缓冲区大小,一般给1024即可
#recv方法返回一个字节对象,需要decode方法转换成字符串
print(f"接收到的客户端信息是:{data}")
#发送回复消息
msg=input("请输入回复信息:").encode("utf-8")
conn.send(msg)
#关闭连接
conn.close()
socket_server.close()
Python
可以借助网络调试助手进行测试
(2)持续运行
在此基础上,写入一个while true的无限循环
whileTrue:

接收客户端信息,要使用客户端与本次的连接对象conn

data: str = conn.recv(1024).decode("utf-8")

recv接受的参数是缓冲区大小,一般给1024即可

recv方法返回一个字节对象,需要decode方法转换成字符串

print(f"接收到的客户端信息是:{data}")

发送回复消息

msg = input("请输入回复信息:")
if msg == "exit":
break
conn.send(msg.encode("utf-8"))
Python

5.2客户端开发

(1)基础单次运行
import socket
#创建socket对象
socket_client=socket.socket()
#连接到服务端
socket_client.connect(('127.0.0.1',8888))
#发送消息
socket_client.send("您好,我是xxx".encode("utf-8"))
#接收消息
recv_data=socket_client.recv(1024)#1024是缓冲区大小,一般1024即可,同样recv方法是阻塞的
print(f"回复的消息是:{recv_data.decode('utf-8')}")
socket_client.close()
Python
(2)持续运行
import socket
#创建socket对象
socket_client=socket.socket()
#连接到服务端
socket_client.connect(('127.0.0.1',8888))
whileTrue:

发送消息

msg = input("请输入发送信息:")
if msg == "exit":
break
socket_client.send(msg.encode("utf-8"))

接收消息

recv_data = socket_client.recv(1024)

1024是缓冲区大小,一般1024即可,同样recv方法是阻塞的

print(f"回复的消息是:{recv_data.decode('utf-8')}")
socket_client.close()
Python

6正则表达式

6.1基本方法

1 re.match

从头开始匹配,成功返回匹配对象(包含匹配信息),不成功返回空。【从头部匹配,开头没有则失败】
import re
s="shanxi univercity is double good"
result=re.match("shanxi",s)
print(result.span())
print(result)
print(result.group())
Python
【从头部匹配,开头没有则失败】返回None
import re
s="1shanxi univercity is double good"
result=re.match("shanxi",s)
print(result)
Python

2 search

搜素整个字符串,找出匹配的,从前往后,找到第一个就停止,不会继续向后
import re
s="18311luanqibaz shanxi univercity is double good"
result=re.search("shanxi",s)
print(result)
Python

3 findall

匹配整个字符串,找出全部匹配项
import re
s="18311luanqibaz shanxi univercity is double good shanxi taiyuan in china shanxi"
result=re.findall("shanxi",s)
print(result)
Python

6.2元字符匹配

字符串r标记表示,字符串内转义字符无效,作为普通字符使用

1单字符匹配

import re
s="18311luanqibaz shanxi univercity666 is double!!!! good shanxi ###taiyuanin china shanxi"
result=re.findall('\d',s)#字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符
print(result)
Python
找出全部数字
找出特殊字符
import re
s="18311luanqibaz shanxi univercity666 is double!!!! good shanxi ###taiyuanin china shanxi"
result=re.findall('\W',s)#字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符
print(result)
Python
匹配所有单词字母
import re
s="18311luanqibaz shanxi univercity666 is double!!!! good shanxi ###taiyuanin china shanxi"
result=re.findall('[A-Za-z]',s)#字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符
print(result)
Python

2数量匹配

3边界匹配

4分组匹配

举例
1匹配账号,只能由字母和数字组成,长度6-10位
import re
r='^[0-9a-zA-Z]{6,10}
s='123456sjks'
print(re.findall(r,s))
Python
2 匹配QQ号,要求纯数字,长度5-11.第一位不为0
import re
r='^[1-9][0-9]{4,10}
s='77068111'
print(re.findall(r,s))
Python
3匹配邮箱地址,只允许qq,163,gmail这三种邮箱地址
import re
r=r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'
s='www.shanxi_univercity@qq.com.cn'
print(re.match(r,s)
Python
s='123456sjks' print(re.findall(r,s)) Python 2 匹配QQ号,要求纯数字,长度5-11.第一位不为0 import re r='^[1-9][0-9]{4,10}$' s='77068111' print(re.findall(r,s)) Python 3匹配邮箱地址,只允许qq,163,gmail这三种邮箱地址 import re r=r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)' s='www.shanxi_univercity@qq.com.cn' print(re.match(r,s) Python
s='77068111' print(re.findall(r,s)) Python 3匹配邮箱地址,只允许qq,163,gmail这三种邮箱地址 import re r=r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)' s='www.shanxi_univercity@qq.com.cn' print(re.match(r,s) Python s='123456sjks' print(re.findall(r,s)) Python 2 匹配QQ号,要求纯数字,长度5-11.第一位不为0 import re r='^[1-9][0-9]{4,10}$' s='77068111' print(re.findall(r,s)) Python 3匹配邮箱地址,只允许qq,163,gmail这三种邮箱地址 import re r=r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)' s='www.shanxi_univercity@qq.com.cn' print(re.match(r,s) Python

7递归

定义:函数自己调用自己的方式
import os
defget_file_recurstion_from_dir(path):
"""
从指定的文件夹中使用递归的方式,获取全部文件
:param path: 被判断的文件夹
:return: list 包含全部文件,如果目录不存在或者无文件就返回一个空
"""
file_list=[]
if os.path.exists(path):
for f in os.listdir(path):
new_path=path+"/"+f
if os.path.isdir(new_path):
file_list+=get_file_recurstion_from_dir(new_path)
else:
file_list.append(new_path)
else:
print(f"指定的目录{ path}目录不存在")
return []
return file_list
if __name__ == '__main__':
print(get_file_recurstion_from_dir("D:/test"))
Python
注意事项:
1 注意组装 file_list+=get_file_recurstion_from_dir(new_path)
2一定要有总结条件 否则会死循环

最新文章

随机文章