Python_05

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_)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值