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中的代码
目录
相关文章
|
11月前
|
Python 容器
【Python基础】Python函数
【Python基础】Python函数
58 0
|
9月前
|
前端开发 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
56 1
|
9月前
|
Shell Python
Python(二十一)python集合set
集合(set)是一个无序的不重复元素序列。 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。 集合是没有value的字典 一:创建集合 1:创建一个集合 ini 复制代码 # 创建集合 set_one = {1, 2, '33', 4, 5} print(set_one) 输出: {'33', 1, 2, 4, 5} 2:创建一个空集合 scss 复制代码 # 创建一个空集合 set_kong = set() print(set_kong) print(type(set_kong))
52 0
|
11月前
|
存储 Python
【Python】学习Python常用函数作用和用法
【Python】学习Python常用函数作用和用法
41 0
|
Python
【从零学习python 】42.Python中的内置属性和方法
【从零学习python 】42.Python中的内置属性和方法
54 0
|
算法 程序员 API
【从零学习python 】35. Python常见系统模块及其用法
【从零学习python 】35. Python常见系统模块及其用法
72 0
|
Python
【从零学习python 】27. Python 函数的使用及嵌套调用
【从零学习python 】27. Python 函数的使用及嵌套调用
67 0
|
Python
【从零学习python 】23. Python中集合(set)的使用方法和常见操作
【从零学习python 】23. Python中集合(set)的使用方法和常见操作
103 0
|
索引 Python 容器
让你的Python代码更加Pythonic
让你的Python代码更加Pythonic
114 0
|
Python 容器
Pythonic--python的方式思考(二)
Pythonic--python的方式思考,函数部分,一些python代码的注意点和规范
88 0