高级编程和编程规范总结

 

1. 可迭代对象

  1. 对list、tuple、dict、set、str等类型的数据使用for…in…的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。
  2. 把可以通过for…in…这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)。

2. 推导式

  • 推导式分为 列表推导式、字典推导式、集合推导式等。在这里以其中一种也是用的最多列表推导式进行演示
  • 列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表简单理解就是由一个旧的列表来构建出一个新的列表

推导式语法

[表达式 for 变量 in 旧列表]
[表达式 for 变量 in 旧列表 if 条件]

ls = ['chenny','amy','body','heading','粒子']   #列表
def fun(ls):
    ls_1 = []  # 定义一个空列表
    for i in ls:          #遍历列表
        if len(i) > 3:    #条件判断,判断ls中字符串长度是否>3
            ls_1.append(i)    #将符合条件的字符串添加到新列表ls_1
    print(ls_1)
fun(ls)
#推导式
ls_2 = [i for i in ls if len(i)>3]
print(ls_2)
  • 例子
#需求:求1-100之间的整数
ls_3 = [i for i in range(1,101) if i % 2 == 0]
print(ls_3)

#需求:求1-100之间的整数,且还能被4整除的数
ls_4 = [i for i in range(1,101) if i % 2 == 0 and i % 4 == 0 ]
print(ls_4)

3.生成器

创建生成器的方式

  1. 使用类似列表推导式的方法得到生成器
#方法一:使用类似列表推导式的方法得到生成器

#获得1-10之间数*2
ls = [i*2 for i in range(1,11)]
print(ls)

#不希望一次性得到太多的数据,需要时要多少数据就能够获得多少数据
gen = (i*2 for i in range(1,11))
print(gen,type(gen))
print(gen.__next__())
#通过next函数来获取
i = 1
while i < 10:
    print(next(gen))
    i += 1

  1. 使用函数+yield来实现
#方法二:使用函数+yield来实现
def fun():
    i = 0
    while True:
        i += 1
        yield i       #生成器yield

r = fun()
print(r)
print(next(r))   #按生成的顺序依次往下取
print(next(r))

只要在函数中出现yield关键字它就是一个生成器函数

生成器的特性

  1. 生成器会记住上一次取数据的位置,然后下一次取数据时继续从上一次的位置运行\
  2. 生成器生成一次数据,当第一次生成的数据取完就会结束生命周期,第二次去取就没有数据了
#生成器的特性:1.生成器会记住上一次取数据的位置,然后下一次取数据时继续从上一次的位置运行\
#            2.生成器生成一次数据,当第一次生成的数据取完就会结束生命周期,第二次去取就没有数据了
gen = (i*2 for i in range(1,11))
print(gen,type(gen))
ls = [i for i in gen]   #第一次取生成器里的数据
ls_1 = [i for i in gen]  #第二次取生成器里的数据
print(ls)
print(ls_1)

4. 迭代器

  • 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束。
#迭代器
class Test():     #创建一个类
    def __init__(self,data=1):    #定义一个方法
        self.data = data

    def __iter__(self):
        return self
    def __next__(self):
        if self.data > 5:
            raise StopIteration     #扔出错误
        else:
            self.data += 1
            return self.data
for item in Test(3):
    print(item)
  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator
      生成器是可迭代的,也是迭代器
      列表是可迭代的,但不是迭代器
      通过iter()函数可以将可迭代的变成一个迭代器
ls = [1,2,3,4,5,6]
ls_1 = (1,2,3,4,5,6)
ite1 = iter(ls)
ite2 = iter(ls_1)
print(ite1)
print(ite2)

5. 规范编写代码

  1. 缩进使用4个空格, 空格是首选的缩进方式. Python3 不允许混合使用制表符和空格来缩进.
  2. 每一行最大长度限制在79个字符以内.
  3. 顶层函数、类的定义, 前后使用两个空行隔开.
  4. import 导入
  • 导入建议在不同的行, 例如:
import os
import sys
  • 不建议如下导包
import os,sys
  • 但是可以如下:
from subprocess import Popen, PIPE
  1. 导包位于文件顶部, 在模块注释、文档字符串之后, 全局变量、常量之前. 导入按照以下顺序分组:
    标准库导入
    相关第三方导入
    本地应用/库导入
    在每一组导入之间加入空行

  2. Python 中定义字符串使用双引号、单引号是相同的, 尽量保持使用同一方式定义字符串. 当一个字符串包含单引号或者双引号时, 在最外层使用不同的符号来避免使用反斜杠转义, 从而提高可读性.

  3. 表达式和语句中的空格

  • 避免在小括号、方括号、花括号后跟空格.
  • 避免在逗号、分好、冒号之前添加空格.
  • 冒号在切片中就像二元运算符, 两边要有相同数量的空格. 如果某个切片参数省略, 空格也省略.
  • 避免为了和另外一个赋值语句对齐, 在赋值运算符附加多个空格.
  • 避免在表达式尾部添加空格, 因为尾部空格通常看不见, 会产生混乱.
  • 总是在二元运算符两边加一个空格, 赋值(=),增量赋值(+=,-=),比较(==,<,>,!=,<>,<=,>=,in,not,in,is,is not),布尔(and, or, not
  • 避免将小的代码块和 if/for/while 放在同一行, 要避免代码行太长.
if foo == 'blah': do_blah_thing()
for x in lst: total += x
while t < 10: t = delay()
  1. 永远不要使用字母 ‘l’(小写的L), ‘O’(大写的O), 或者 ‘I’(大写的I) 作为单字符变量名. 在有些字体里, 这些字符无法和数字0和1区分, 如果想用 ‘l’, 用 ‘L’ 代替.

  2. 类名一般使用首字母大写的约定.

  3. 函数名应该小写, 如果想提高可读性可以用下划线分隔.

  4. 如果函数的参数名和已有的关键词冲突, 在最后加单一下划线比缩写或随意拼写更好. 因此 class_ 比 clss 更好.(也许最好用同义词来避免这种冲突).

  5. 方法名和实例变量使用下划线分割的小写单词, 以提
    高可读性.

6. 练习

  1. 请使用装饰器实现已存在的函数的执行所花费的时间。
    • time模块
# 1. 请使用装饰器实现已存在的函数的执行所花费的时间。
# • time模块
import time      #导包
t1 = time.time()    #获取开始时间

def fun_1(fn):        #定义外层函数
    def new_fun(*args,**kwargs):     #定义内层内层函数,不定长参数
        print('程序开始')
        fn(*args,**kwargs)
        print('程序结束')
    return new_fun

@fun_1   #生成器的语法糖写法
def fun(a):
    for i in range(1,a):
        print('{:@^15}'.format(i))
    return '结束了'

n = eval(input("请输入尽可能大的任意整数:"))
fun(n)
t2 = time.time()   #获取结束时间
m = t2-t1        #计算时间差
print(f'整个程序耗时:{m}s')

总结

本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。

仅是个人意见,如有不足之处或者侵权,请留言

posted @ 2021-03-28 10:35  wakeyo_J  阅读(78)  评论(0)    收藏  举报