给Python初学者的一些技巧

以下是我近些年收集的一些Python实用技巧和工具,希望能对你有所帮助。

交换变量

if 语句在行内

连接

下面的最后一种方式在绑定两个不同类型的对象时显得很cool。

数字技巧

注意浮点数的除法

数值比较

这是我见过诸多语言中很少有的如此棒的简便法

同时迭代两个列表

带索引的列表迭代

列表推导式

已知一个列表,我们可以刷选出偶数列表方法:

转变成如下:

是不是很牛呢,哈哈。

字典推导

和列表推导类似,字典可以做同样的工作:

初始化列表的值

列表转换为字符串

从字典中获取元素

我承认try/except代码并不雅致,不过这里有一种简单方法,尝试在字典中查找key,如果没有找到对应的alue将用第二个参数设为其变量值。

获取列表的子集

有时,你只需要列表中的部分元素,这里是一些获取列表子集的方法。

60个字符解决FizzBuzz

前段时间Jeff Atwood 推广了一个简单的编程练习叫FizzBuzz,问题引用如下:

写一个程序,打印数字1到100,3的倍数打印“Fizz”来替换这个数,5的倍数打印“Buzz”,对于既是3的倍数又是5的倍数的数字打印“FizzBuzz”。

这里就是一个简短的,有意思的方法解决这个问题:

集合

除了python内置的数据类型外,在collection模块同样还包括一些特别的用例,在有些场合Counter非常实用。如果你参加过在这一年的Facebook HackerCup,你甚至也能找到他的实用之处。

 迭代工具

collections库一样,还有一个库叫itertools,对某些问题真能高效地解决。其中一个用例是查找所有组合,他能告诉你在一个组中元素的所有不能的组合方式

False == True

比起实用技术来说这是一个很有趣的事,在python中,True和False是全局变量,因此:

如果你还有任何很酷的奇技淫巧,可以在下面留言,感谢阅读。

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

9 收藏 18 评论

关于作者:刘志军

个人博客:http://foofish.net,微信公众号:Python之禅(ID:VTtalk) 个人主页 · 我的文章 · 43 ·   

相关文章

可能感兴趣的话题



直接登录
最新评论
  • bells   2013/01/28

    for x in range(101):print"fizz"[x%3*4::]+"buzz"[x%5*4::]or x
    上面 print后面 不懂。。求解释

    • Kevin   2013/01/28

      print后面分为两部分,第一部分是"fizz"[x%3*4::]+"buzz"[x%5*4::],第二部分是x。两部分使用逻辑或连接。如果第一部分为空,则最终结果为第二部分的结果。如果第一部分非空,则最终结果为第一部分。第一部分由两个字符串连接而成,第一个字符串为"fizz"[x%3*4::],如果x是3的倍数,则x%3=0,那么"fizz"[x%3*4::]="fizz"[0::]="fizz";如果x不是3的倍数,则x%3=1或2,那么"fizz"[x%3*4::]="fizz"[4::]或"fizz"[8::]=""。第二个字符串为"buzz"[x%5*4::],如果x是5的倍数,那么"buzz"[x%5*4::]="buzz"[0::]="buzz";如果x不是5的倍数,那么x%5=1,2,3,4,那么"buzz"[x%5*4::]="buzz"[4::]或"buzz"[8::]或"buzz"[12::]或"buzz"[16::]或"buzz"[20::]=""。由此,如果x是3的倍数,第一部分为"fizz";如果x是5的倍数,第一部分为"buzz";如果x既是3的倍数,又是5的倍数,则第一部分为"buzzfizz",如果既不是3的倍数,也不是5的倍数,则第一部分为""。

      • 蓝☆天   2013/01/29

        请问 "fizz"[4::]或"fizz"[8::]为什么等于 "" 呢?谢谢

        • 蓝☆天   2013/01/30

          貌似明白了:[n::]是应该是等价于[n:]的,不过我第一次看到有[n::]的写法

        • cxccode   2013/01/30

          s[i:j:k]表示下标从i到j(不含j),步长为k的一段。j没有指定时,默认值为len(s), k没有指定,默认值为1.当i>=j时,取到的内容为空。所以"fizz"[4::]取到的是""。

          可以看http://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange

        • changzhi   2013/02/27

          我觉得这个就和数组是差不多的,fizz对应的是[0, 1, 2, 3]最多到3,如果是“fizz”[4::]或”fizz”[8::]当然就是none的啦!

      • changzhi   2013/02/27

        十分感谢!

    • cxccode   2013/01/28

      原文是for x in range(1,101):print"Fizz"[x%3*4:]+"Buzz"[x%5*4:]or x。这里两个:也是对的,不过原文写法好理解些。

  • Kevin   2013/01/29

    print后面分为两部分,第一部分是"fizz"[x%3*4::]+"buzz"[x%5*4::],第二部分是x。两部分使用逻辑或连接。如果第一部分为空,则最终结果为第二部分的结果。如果第一部分非空,则最终结果为第一部分。第一部分由两个字符串连接而成,第一个字符串为"fizz"[x%3*4::],如果x是3的倍数,则x%3=0,那么"fizz"[x%3*4::]="fizz"[0::]="fizz";如果x不是3的倍数,则x%3=1或2,那么"fizz"[x%3*4::]="fizz"[4::]或"fizz"[8::]=""。第二个字符串为"buzz"[x%5*4::],如果x是5的倍数,那么"buzz"[x%5*4::]="buzz"[0::]="buzz";如果x不是5的倍数,那么x%5=1,2,3,4,那么"buzz"[x%5*4::]="buzz"[4::]或"buzz"[8::]或"buzz"[12::]或"buzz"[16::]或"buzz"[20::]=""。由此,如果x是3的倍数,第一部分为"fizz";如果x是5的倍数,第一部分为"buzz";如果x既是3的倍数,又是5的倍数,则第一部分为"buzzfizz",如果既不是3的倍数,也不是5的倍数,则第一部分为""。

  • willmill   2013/01/31

    好吧,我是昨天入门的初学者(或许应该是准备入門)
    >>> print {key: value for value, key in enumerate(teams)}
    File "<stdin>", line 1
    print {key: value for value, key in enumerate(teams)}
    ^
    箭头指着for的r在,是什么原因呢?

  • huimark   2013/02/02

    第二条,if语句在行内,是什么意思?求解释

  • ureygo   2013/02/04

    好文章,挺有意思!
    #最后3个
    print x[3:]
    这个注释有点问题喔,是3到len

  • adfad   2013/04/13

    译者名字霸气侧漏

  • 书生Maple   2014/09/03

    python 2.7.8------print .3/.1 -->3.0

跳到底部
返回顶部