python day05 没有上帝和我懂得注释,请见谅!!!代码规范、装饰器、进程and线程(1)

PEP8编码规范,以及开发中的一些惯例和建议

1.代码编排:
缩进4个空格,禁止空格与Tab混用
行长80:防止单行逻辑过于复杂
2.import
不要使用from xxx import *
3.顺序:
标准库
第三方库
自定义库
4.单行不要import多个库
模块内用不到的不要去import
5.空格
:,;后面跟一个空格,前面无空格(行尾分号后无空格)
6.二元操作符前后各一个空格,包括以下几类:
数学运算符:+ -*/// = & |
比较运算符: ==!= > < >= <= is not in
逻辑运算符:and or not
位运算符:& | " << >>
7.适当添加空行
函数间:顶级函数间空2行,类的方法之间空1行
函数内:同一函数内的逻辑块之间,空1行
文件结尾:留一个空行(Unix中\n是文件的结束符)
8.注释
忌:逐行添加注释,没有一个注释
行内注释:单行逻辑过于复杂时添加
块注释:一段逻辑开始时添加
引入外来算法或者配置时须在注释中添加源连接,标明出处
函数和类尽可能添加docstring
9.命名
除非在lambda函数中,否则不要用单字母的变量名(即使是lambda函 数中的变量名也应该尽可能的有意义)
包名、模块名、函数名、方法名全部使用小写,单词间用下划线连接
类名、异常名使用CapWordS(首字母大写)的方式,异常名结尾加Error 或 Wraning 后缀
全局变量尽量使用大写,一组同类型的全局变量要加上统一前缀,单词用下 划线连接
字符串拼接尽量使用join方式:速度快,内存消耗小
语意明确、直白
not xx in yy VS xx not in yy
not a is b VCS a is not b
10.程序的构建
一个函数只做一件事情,并把这件事做好
大的功能用小函数之间灵活组合来完成
避免编写庞大的程序,"大”意味着体积庞大,逻辑复杂甚至混乱
函数名必须有动词,最好是do_something的句式,或者 somebody_do_something 句式
自定义的变量名、函数名不要与标准库中的名字冲突
pip install pep8 pylintflake8

装饰器

最简装饰器

def deco(func):
    def wrap(*args, **kwargs): 
        return func(*args, **kwargs) 
    return wrap

@deco
def foo(a, b):
    return a ** b

练习:

def deco(func):
    def warp(num1,num2):
        s1=num1+num2
        return func(s1,num2)
    return warp

@deco
def A(name,name1):
    print(name)

A(10,20)
====================
30

函数闭包

引用了自由变量的函数即是一个闭包.这个被引用的自由变量和这个函数一同 存在,即使已经离开了创造它的环境也不例外.

def foo():
    l =[] 
    def bar(i):
        l.append(i) 
        return l 
    return bar
f1 = foo()
f2 = foo()
#说出下列语句执行结果
#说出下列语句执行结果
f1(1)
f1(2)
f2(3)
======================
[3]

进程和线程

在当下不管是用什么编程语言进行开发,实现让程序同时执行多个任务也就是常说的“并发编程”,应该是程序员必备技能之一。为此,我们需要先讨论两个概念,一个叫进程,一个叫线程。

概念

进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。
一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。
当然多线程也并不是没有坏处,站在其他进程的角度,多线程的程序对其他程序并不友好,因为它占用了更多的CPU执行时间,导致其他程序无法获得足够的CPU执行时间;另一方面,站在开发者的角度,编写和调试多线程的程序都对开发者有较高的要求,对于初学者来说更加困难。

Python既支持多进程又支持多线程,因此使用Python实现并发编程主要有3种方式:多进程、多线程、多进程+多线程。
实例:
无进程:

from random import randint
from time import time, sleep


def download_task(filename):
    print('开始下载%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))


def main():
    start = time()
    download_task('Python从入门到住院.pdf')
    download_task('Peking Hot.avi')
    end = time()
    print('总共耗费了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()
===========================================
开始下载Python从入门到住院.pdf...
Python从入门到住院.pdf下载完成! 耗费了5秒
开始下载Peking Hot.avi...
Peking Hot.avi下载完成! 耗费了9秒
总共耗费了14.00秒.

两个进程:

from multiprocessing import Process
from os import getpid
from random import randint
from time import time, sleep


def download_task(filename):
    print('启动下载进程,进程号[%d].' % getpid())
    print('开始下载%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))

    
def main():
    start = time()
    p1 = Process(target=download_task, args=('Python从入门到住院.pdf', ))
    p1.start()
    p2 = Process(target=download_task, args=('Peking Hot.avi', ))
    p2.start()
    p1.join()
    p2.join()
    end = time()
    print('总共耗费了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()
===========================
    总共耗费了0.18秒
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值