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中的代码
目录
相关文章
|
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)--函数设计
|
存储 自然语言处理 索引
Python基础用法 下
Python基础用法 下
80 0
|
IDE Java Linux
Python基础用法 上
Python基础用法 上
120 0
|
索引 Python 容器
让你的Python代码更加Pythonic
让你的Python代码更加Pythonic
123 0