Pythonic--python的方式思考(二)

简介: Pythonic--python的方式思考,函数部分,一些python代码的注意点和规范

参考引用于《Effective Python》 Brett Slatkin

function-函数


14、返回值


  • 不返回None
  • 尽量raise 异常


15、闭包中使用外围作用域的变量


闭包:一中定义在某个作用域的函数,这个函数引用了那个作用于里面的变量,helper是闭包

defsort_x(values, group):
found=Falsedefhelper(x):
ifxingroup:
found=Truereturn (0, x)
return (1,x)
values.sort(key=helper)


  • 闭包中可以调用外围的变量,但是闭包中对外围变量进行赋值,不会污染外围变量。即使经过了调用,found的值也不会发生改变–>使用nonlocal
defsort_x(values, group):
found=Falsedefhelper(x):
nonlocalfound#闭包中的改变,也会影响外围变量ifxingroup:
found=Truereturn (0, x)
return (1,x)
values.sort(key=helper)

与global形成一种互补(类似),global作用域模块的全局。nonlocal不会作用域模块间

  • python2 无法使用


16、生成器直接改写 返回列表的函数


  • 优点:
  • 更清晰
  • 可以传给yield,以此产生出来
  • 不会影响执行时所耗费内存
  • 常规写法:


/

defindex_words(text):
result= []
iftext:
result.append(0)
forindex, letterinenumerate(text):
ifletter==' ':
result.append(index+1)
returnresult###  exp:[0, 7, 13, 17, 27]x=index_words2('asdasd asdas asd asdasdasd asdas')
print(x)
  • 改进一:生成器函数
defindex_words2(text):
iftext:
yield0forindex, letterinenumerate(text):
ifletter==' ':
yieldindex+1###  exp:[0, 7, 13, 17, 27]x=index_words2('asdasd asdas asd asdasdasd asdas')
print(list(x))
  • 缺点:输入量过大,list崩溃
  • 改进二:生成器改写,解数据量大
defindex_words3(text):
offset=0forlineintext:        # 最大消耗内存为单行最长的字符数,进行了内存的清空操作ifline:
yieldoffsetforindex, letterinenumerate(line):
offset+=1ifletter==' ':
yieldoffsetif__name__=="__main__":
withopen('1.txt', 'r') asr:
rr=index_words3(r)
result=itertools.islice(rr, 0, 3)  #直接对迭代器的内容进行操作print(list(result))

17. 迭代器注意事项(再学习)


  • 以迭代器为参数,可能无法返回任何现象
  • 因为:在抛出Stop Iteration异常(例如for循环的结束)后的迭代器和生成器上继续迭代,不会产生结果
classtext:
def__init__(self):
self.path=''#   修改这个东西,可以改变当前容器的类型 def__iter__(self):
withopen('data/number.txt', 'r') asr:
forvinr:
print(v)
  • 核心是减少内存的高频交换,多使用iter进行处理


18. 数量可变的位置参数减少视觉杂乱


  • 优势:之前必须传入很多参数,导致程序写法固定,即使不需要也得进行输入
  • 缺点:
  • *的操作符为生成器的参数,必须先迭代一遍。每一个值都放入tuple(变长需要先转化为元组)。迭代的还是别用\*args
  • 错误的传入被屏蔽了,程序不报错


19. 用关键字参数表达参数输入


  • 如题 √


20. None & 文档字符串描述具有动态默认值的参数

importdatetimefromtimeimportsleepdeflog(message, when=datetime.datetime.now()):
print(when,message)
if__name__=='__main__':
log('first')
sleep(1)
log('second')
#### 2020-09-22 16:46:16.833298 first#### 2020-09-22 16:46:16.833298 second'问题:竟然两次输出的时间一致--》函数只在初始化的时候加载了一次,datetime.now()只进行了一次'##   只要不在函数传值是抛出这些就OK
  • 即使传递的时候定义为{} []这些也不行,在初次运行时也会进行定义。一定要定义为None


21.关键词形式制定的参数保证明晰


  • 如题
目录
相关文章
|
3月前
|
Python
Python中的tuple:探索其强大功能与实用技巧
Python中的tuple:探索其强大功能与实用技巧
43 1
|
前端开发 Shell PHP
Python(二十七)python raise语法!
Python可以使用raise手动抛出异常。 看到菜鸟教程里边对 raise 的这个定义的时候,我有点迷茫,我在极力的去避免异常出现,我为什么还要手动抛出异常呢? 1:raise 语句的基本语法格式: raise [exceptionName [(reason)]] 2:基本使用方法 (1):直接一个raise抛出异常 python 复制代码 try: i = 1 while(i < 10): raise print(i) i += 1 except: print('raise 手动抛出异常') 输出: bas
77 1
|
前端开发 Shell 索引
Python(二十二)python切片的相关概念总结
首先,要注意一件事,在python中,字符串,元组,列表的取值都可以使用下标来实现。 其实切片这个用法之前在看列表和元组的时候,提到过。 说白了其实就是根据索引获取元素。只是在python中,给他起了个名字叫切片。 一:切片操作语法 一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时,默认第三个参数step=1;当一个“:”也没有时,start_index=end_index,表示切取start_index指定的那个元素。 切片操作基本表达式: css 复制代码 object[start_index:end_in
152 0
|
存储 Python
【Python】学习Python常用函数作用和用法
【Python】学习Python常用函数作用和用法
52 0
|
Python
【从零学习python 】49. Python中对象相关的内置函数及其用法
【从零学习python 】49. Python中对象相关的内置函数及其用法
72 0
|
Python
【从零学习python 】27. Python 函数的使用及嵌套调用
【从零学习python 】27. Python 函数的使用及嵌套调用
77 0
|
Python
python(15)--函数设计
python(15)--函数设计
182 0
python(15)--函数设计
|
IDE Java Linux
Python基础用法 上
Python基础用法 上
120 0
|
存储 自然语言处理 索引
Python基础用法 下
Python基础用法 下
80 0
|
索引 Python 容器
让你的Python代码更加Pythonic
让你的Python代码更加Pythonic
123 0