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

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

参考引用于《Effective Python》 Brett Slatkin


1. 确定python版本

importsysprint(sys.version_info)
sys.version_info(major=3, minor=6, micro=10, releaselevel='final', serial=0)
print(sys.version)
3.6.10|Anaconda, Inc.| (default, Mar252020, 18:53:43) 
[GCC4.2.1CompatibleClang4.0.1 (tags/RELEASE_401/final)]


2. 编码风格PEP8


  • 长度、4空格、不用制表符
  • 函数与类—>空两行,函数之间空一行
  • 符号之前不加空格,之后加空格
  • 命名相关:
  • 保护实例属性  _
  • 私有实例 __
  • 类与异常,首字母大写
  • 模块级别的常量,全部大写
  • import 基本分为三块,标准库、第三方库、自用库
  • self表示实例对象本身,cls表示类本身


3. bytes、str、unicode(再理解)


  • Python2包含strunuicode,可以使用相关的操作符进行比较
  • Python3包含bytesstr,属于不同的实例,无法比较

# 这块多思考一下吧,其实两者差别比较大。用的时候也有编码的问题

#python3ifisinstance(xx, bytes):
value=xx.decode('utf-8')
else:
value=xxreturnvalue#  返回str类型ifisinstance(xx, str):
value=xx.encode('utf-8')
else:
value=xxreturnvalue#  返回二进制类型#python2ifisinstance(xx, str):
value=xx.decode('utf-8')
else:
value=xxreturnvalue#  返回unicode类型ifisinstance(xx, unicode):
value=xx.encode('utf-8')
else:
value=xxreturnvalue#  返回str类型


4. 辅助函数代替复杂表达式


  • 过长的字符解析,不易理解,使用if/else 或者函数要优于,or、and、boolean


5. 序列的切割(list,str,bytes)


  • (sclice)几点注意的写法
  • 开始的切片不写0    [0:5]–>[:5]
  • 末尾不写len()          [0:len(x)]–>[0:]
  • 优势:
  • 易于理解:[-3:-1] 推荐多使用
  • 不用担心越界,用于限定最长的长度[:20]
  • 切割的三点特性
  • 切割赋予–> deepcopy
  • 切割后,改变中间值,不影响切割前后的序列
  • deepcopy & copy


###  1.切割赋予后,类似于deepcopyb=a[:4]
b[1] =2#a 不变化## 2. 对于切割后,改变中间值,前后不变进行补充a= [1,2,3,4,5,6,7]
a[2:4] = [8]
print (a)
##[1, 2, 8, 5, 6, 7]## 3. deepcopy & copya= [1,2,3,4,5,6,7]
b=ac=a[:]
b[0] =2## b = a = [2,2,3,4,5,6,7]c[0] =4## c = [4,2,3,4,5,6,7]


6. 不同时指定(start,end,stride)


  • 奇偶索引:
  • a[::2]
  • a[1::2]
  • 序列反转
  • a[::-1]
  • (对于utf-8字符无效)例如:‘‘谢谢’’
  • 同时指定两个输入即可,stride基本使用正数
  • 等价于
forxinitertools.islice(c, 10, 13):
print(x)


7-9.列表推导


  • 列表推导代替map&filter
  • 不对两个以上的表达式进行列表推导
  • 问题:
  • 数据过多时候,对每一个推导的list创建一个列表,耗费过多内存,速度变慢
  • 使用生成器进行求值,返回迭代器,使用其他生成器进行读取


# 每一行得到的数据长度都已经保存在内存中了v= [len(x) forxinopen('1.txt')]
print(v)
[22,1,...........90]
#用迭代器进行保存和读取it=len(x) forxinopen('1.txt')
#此时it是一个generatorans= ((x,x**0.5)  forxinit)
#使用ans进行输出

10、用enumerate 取代 range


  • 使用的很熟了


11、用zip遍历两个迭代器


  • python2可能导致内存问题,因为产生的值一次性都汇聚为元组,慎用。Python3是生成器,逐渐生成
  • 长度取最短


/

#构造字典stu=dict(zip(names, scores))


12、不用for/while  else


  • 若不执行循环,执行else
  • 若判断的为空==》不执行循环


13、try\except\else\finally


  • else的作用,尽可能缩减try中的代码
相关文章
|
Python
|
Python
Python快速上手系列--字符串--详解篇
Python快速上手系列--字符串--详解篇
57 0
|
程序员 Python
说说Python中with的用法?
公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!
138 0
|
5月前
|
Python
python基本用法
【9月更文挑战第5天】python基本用法
66 7
|
4月前
|
Python
Python pip 操作的几种用法
Python pip 操作的几种用法
89 0
|
Python
Python​ 重解零基础100题(5)
Python​ 重解零基础100题(5)
83 0
|
机器人 Python
Python​ 重解零基础100题(3)
Python​ 重解零基础100题(3)
145 0
|
Python
Python​ 重解零基础100题(7)
Python​ 重解零基础100题(7)
143 0
|
Python
Python​ 重解零基础100题(4)
Python​ 重解零基础100题(4)
106 0

热门文章

最新文章