PEP8编码规范,以及开发中的一些惯例
1、代码编排:
(1)缩进4个空格,禁止空格与Tab混用
(2)行长80:防止单行逻辑过于复杂
2、import:
(1)不要使用:from xxx import *
(2)顺序:1.标准库;2.第三方库;3.自定义库
(3)单行不要 import 多个库
(4)模块内用不到的不要去 import
3、空格:
(1)‘: , ; ’后面跟个空格,前面无空格(行尾分号后无空格)
(2)二元操作符前后各一个空格,包括以下几类:1.数学运算符( + - * / // = & |);2.比较运算符( == != > < >= <= is not in);3.逻辑运算符(and or not );4.位运算符( & | ^ << >>)
(3)当‘=’用于指示关键字参数或默认参数值时,不要在其两侧使用空格
4、适当添加空行:
(1)函数间:顶级函数间空2行,类的方法之间空1行
(2)函数内:同一函数内的逻辑块之间,空1行
(3)文件结尾:留一个空行
5、注释:
(1)忌:逐行添加注释或没有一个注释
(2)行内注释:单行逻辑过于复杂时添加
(3)块注释:一段逻辑开始时添加
(4)引入外来算法或者配置时须在注释中添加源连接,标明出处
6、命名:
(1)不要使用单字母的变量名
(2)包名、模块名、函数名、方法名全部使用小写单词,单词之间需要用下划线‘_’来连接
(3)类名、异常名用首字母大写的方式来写
(4)全局变量尽量使用大写,一组同类型的全局变量要加上统一前缀,单词用下划线连接
7、自定义的变量名、函数名不要与库中的名字冲突
Python 的赋值和引用
1、‘==’ , ‘is’ 的意思:前一个是判断值的,后一个是判断内存地址的(即对象的id)
2、小整数对象:[-5,256]
3、copy和deepcopy的区别:
(1)copy:只拷贝表层元素
(2)deepcopy:在内存中重新创建所有子元素
装饰器
代码如下:
#装饰器
def tzx(func):
def warp(n1, n2):
sum_1 = n1 + n2
return func (sum_1)
return warp
#主函数
@tzx #返回装饰器
def A(sum_):
print('和是:%d'% sum_)
#执行
A(1, 2)
#答案
和是:3
import time
TIME1 = 0
TIME2 = 0
def tzx_ip(func):
def warp(*args,**kwargs):
if round(abs(TIME2 - TIME1),3) < 0.5:
print('404')
else:
return func(*args,**kwargs)
return warp
@tzx_ip
def tzx(ip):
print('进入网页成功')
#模拟请求
for _ in range(50):
ip = '438.0.0.1'
TIME1 = time.time()
tzx(ip)
TIME2 = time.time()
time.sleep(1)
import random
def deco(func):
def warp(n1,n2):
n1 = 1234 #如果这里存在n1 = ,那么验证码就算输对,也会报验证码错误;如果没有n1 = ,那么验证码输对,就报验证码正确。
return func(n1,n2)
return warp
@deco
def tzx(n1,n2):
if n1 == n2:
print('验证码正确')
else:
print('验证码错误')
num1 = random.randint(1000,9999)
print('验证码是%d'%num1)
num2 = int(input('请输入验证码:'))
tzx(num1,num2)
进程和线程
今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而缩短程序的执行时间,同时也让用户获得更好的体验。因此在当下不管是用什么编程语言进行开发,实现让程序同时执行多个任务也就是常说的“并发编程”,应该是程序员必备技能之一。为此,我们需要先讨论两个概念,一个叫进程,一个叫线程。
概念
进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。
一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。由于线程在同一个进程下,它们可以共享相同的上下文,因此相对于进程而言,线程间的信息共享和通信更加容易。当然在单核CPU系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯一的一个线程,多个线程共享了CPU的执行时间。使用多线程实现并发编程为程序带来的好处是不言而喻的,最主要的体现在提升程序的性能和改善用户体验,今天我们使用的软件几乎都用到了多线程技术,这一点可以利用系统自带的进程监控工具来证实。
当然多线程也并不是没有坏处,站在其他进程的角度,多线程的程序对其他程序并不友好,因为它占用了更多的CPU执行时间,导致其他程序无法获得足够的CPU执行时间;另一方面,站在开发者的角度,编写和调试多线程的程序都对开发者有较高的要求,对于初学者来说更加困难。
Python既支持多进程又支持多线程,因此使用Python实现并发编程主要有3种方式:多进程、多线程、多进程+多线程。
#进程
import multiprocessing
def A(name):
print(name)
if __name__ == "__main__":
p = multiprocessing.Process(target=A,args=('tzx',))
p.start()
p.join()
print('OK')
作业
#下载歌曲
import json
import multiprocessing
import requests
def text (path):
list1 = []
list2 = []
with open(path,mode='r') as f:
res = f.readlines()[0].strip('\n').split('}')
for json_ in res[:-1]:
_json = json_ + '}'
_json = json.loads(_json)
song_play_url = _json['song_play_url']
if song_play_url is not None:
list1.append(song_play_url)
song_name = _json['song_name']
list2.append(song_name)
return list1 , list2
song_url,song_name = text('F:\\Python\\Python课程\\作业\\Homewrok5\\top_500.txt')
def A(song_url,song_name):
i = -1
for path in song_url:
i += 1
response = requests.get(path)
mp3_ = response.content
with open('F:\\Python\\Python课程\\作业\\Homewrok5\\music\\'+song_name[i]+'.mp3',mode='wb') as f:
f.write(mp3_)
if __name__ == "__main__":
x = int(len(song_url)/2)
p1 = multiprocessing.Process(target = A,args=(song_url[0:x],song_name[0:x]))
p2 = multiprocessing.Process(target = A,args=(song_url[x:],song_name[x:]))
p1.start()
p2.start()
p1.join()
p2.join()
答案:
获取歌曲URL代码
import json
with open('/Users/top_500.txt',mode='r') as f: # 打开代码所在位置
res = f.readlines()[0].strip('\n').split('}')
for json_ in res[:-1]:
_json = json_ + '}'
_json = json.loads(_json)
song_play_url = _json['song_play_url']
if song_play_url is not None:
print(song_play_url)
下载歌曲的代码
path='https://webfs.yun.kugou.com/201908192103/34f30c50f3dddf902489d8329b5a8256/G072/M03/1B/04/iA0DAFc4Oq2ASH8UACk2YICuxZ0695.mp3'#歌曲代码
import requests
response = requests.get(path)
mp3_ = response.content
#下载歌曲到指定文件夹
with open('文件夹地址',mode='wb') as f:
f.write(mp3_)