设为首页 收藏本站
查看: 2527|回复: 0

[经验分享] python有趣用法汇总(持续更新)

[复制链接]

尚未签到

发表于 2018-8-8 06:59:32 | 显示全部楼层 |阅读模式
  使用python过程中经常会不经意间遇到非常有趣的用法,于是特意搜集了一些

有趣的用法
  1.for-else用法
  循环正常结束则执行else语句。一般用于循环找符合条件的元素,如果找到则break调出循环,不会触发else;如果没有找到(完整运行循环)则print not found
  详见Python中循环语句中的else用法
  《Effictive Python》一书中对for-else用法提出了质疑,主要观点是可以通过封装成函数来取代这一用法,而封装成函数是更加通用易懂的做法,所以一般不会使用for-else用法。为了不影响文章的紧凑,我把评论区对书上内容的引用放在文末“更新补充”部分,有兴趣的读者可以去看一下。
  2.try-else用法
  如果没有触发异常就执行else
  参考这里
  3.解包用法
  类似这样a,b,c = ['a', 'b', 'c']
  python有趣的解包用法
  4.单行if-else
  

a = 1  
b = 3
  
if a == 1
  
else 2
  
print('it is one' if a == 1 else 'no')
  

  

  5.迭代器传入函数中不用加括号
  

# 一般是这样  
a = (i for i in range(10))
  
sum(a)
  
# 我们可以这样
  
sum((i for i in range(10)))
  
# 但我们还可以这样
  
sum(i for i in range(10))
  
# 类似的有
  
' '.join(str(i) for i in range(10))
  
#加群:725479218 获取更多的学习资料
  

  6.对生成器进行筛选
  一个素数生成器的例子
  7.or的用法
  python中x or y表示如果x为真就是x的值,否则为y的值
  我们会经常看到类似这样的用法(比如函数的一个value参数没有设置默认值,这样使用就允许它不赋值)
  

value = value or {}  
# 相当于
  
value = value if value else {}
  

  

  8.and的用法
  python中x and y表示如果x是假,结果就是x的值,否则就是y的值
  x and y and z多个and连接时,如果全是真结果就是最后一个的值;如果中间有假的值,结果就是第一个假的值
  举一个例子
  

def not_empty(a):  return a and a.strip()
  

  
not_empty(' a ')
  
# 值为 'a'
  
not_empty(None)
  
# 不会报错(如果 return a.strip() 就会报错)
  

  
# 在处理None的问题上相当于
  
def not_empty(a):
  if a is None:
  return None
  else:
  return a.strip()
  
#加群:725479218 获取更多的学习资料
  

  细细品味and和or的差别,他们逻辑类似,但是实现的功能是不可以相互替代的


  • or 是结果如果不满意有个善后工作
  • and是要做一件事之前先检验一下,不能做就不让它做
  9.if value:
  

# 要用  
if value:
  
# 不要用
  
if value == True:
  

  

  这里总结一下这种情况下什么时候是True,什么时候是False
  False: 0 0.0 '' [] {} () set() None False
  True:


  • ' ' 'anything' [''] [0] (None, )
  • 没有内容的可迭代对象
  另外要注意一点,我们用if判断一个对象是不是None的时候,要if a is None而不要直接if a,因为如果是后者,有非常多不是None的情况也会判定为False,比如空字符串、空列表等,为了精确指定None还是要用前者,这也是一种规范。
  10.下划线的特殊使用
  python中下划线是一种特殊的变量和符号,有一些特殊的用途
  详见python中下划线的使用
  11.文档字符串
  python有一种独一无二的注释方式,在包、模块、函数、类中第一句,使用'''doc'''这样三引号注释,就可以在对象中用__doc__的方式提取
  比较规范的写法是这样的(这里参考grequests模块的写法)
  

def myfun(a, b):  '''add two numbers
  :param a: one number
  :param b: another number
  :returns: a number
  '''
  print(a + b)
  

  
print(myfun.__doc__)
  

  
# 结果为
  
add two numbers
  :param a: one number
  :param b: another number
  :returns: a number
  #加群:725479218 获取更多的学习资料
  

  其实参数还有其他的写法,如numpy库的写法,可以看这里
  除此之外,函数注释还有另一种方式,函数名可以直接调用某个参数的注释,详Python 的函数注释

有用的函数
  1.sum的本质
  本质:sum(iterable, start=0)将可迭代对象使用+连接
  所以sum([[1,2],[3,4]], [])返回结果为[1, 2, 3, 4]
  2.range(start, stop[, step])
  可以直接用for i in range(10, 0, -1)降序循环
  3.enumerate循环索引
  

for index, item in enumerate(['a', 'b', 'c']):  print(index, item)
  
输出:
  
0 a
  
1 b
  
2 c
  

  

  4.管道操作
  func1(func2(func3(a)))写成类似a %>% func3 %>% func2 %>% func1,清晰展示函数执行的顺序,增强可读性
  python本身不带有这样的用法,只是一些库提供了这样的用法,比如pandas和syntax_sugar
  参考stackoverflow上的这个回答

其他
  另外,就是一些基础的


  • 列表推导式
  • 装饰器
  • 生成器
  • map reduce filter
  • 链式比较
  • 类的魔术方法
  上面很多在廖雪峰python教程中都能找到
  阅读优秀的代码也是提高编程水平的好方法,参考下面这个问题
  初学 Python,有哪些 Pythonic 的源码推荐阅读?
  学习代码规范可以参考下面资料


  • PEP8
  • Python 代码、单元测试和项目规范
  • google开源项目风格指南
  更新补充


  • for-else的更多讨论
  下面引用《Effictive Python》一书中内容
  ``
  a = 4 b = 9

  for i in range(2, min(a, b) + 1):
  print('Testing', i)
  if a % i == 0 and b % i == 0:
  print('Not coprime')
  break
  else:
  print('Coprime')
  ``
  随后作者写到:
  In practice, you wouldn’t write the code this way. Instead, you’d write a helper function to do the calculation. Such a helper function is written in two common styles.
  The first approach is to return early when you find the condition you’re looking for. You return the default outcome if you fall through the loop.
  def coprime(a, b):
  for i in range(2, min(a, b) + 1):
  if a % i == 0 and b % i == 0:
  return False
  return True
  The second way is to have a result variable that indicates whether you’ve found what you’re looking for in the loop. You break out of the loop as soon as you find something.
  def coprime2(a, b):
  is_coprime = True
  for i in range(2, min(a, b) + 1):
  if a % i == 0 and b % i == 0:
  is_coprime = False
  break
  return is_coprime

  结尾:

  Both of these approaches are so much clearer to readers of unfamiliar code. The expressivity you gain from the else block doesn’t outweigh the burden you put on people (including yourself) who want to understand your code in the future. Simple constructs like loops should be self-evident in Python. You should avoid using else blocks after loops entirely.

  总结起来就是for-else的优势是可以被写函数的方式替代的

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-548355-1-1.html 上篇帖子: Python监控文件内容变化 下篇帖子: python ssh免登陆
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表