Python早期学习的重要语言特性(习语)是什么?

时间:2009-02-19 21:29:50

标签: python idioms

我很想知道StackOverflow社区认为Python的重要语言特性(成语)是什么。将程序员定义为Pythonic的功能。

Python(pythonic)习语 - “代码表达式”,它是Python语言的自然或特征。

另外,所有Python程序员都应该尽早学习哪些成语?

提前致谢

相关:

12 个答案:

答案 0 :(得分:24)

Python是一种可以描述为的语言:

  

“你可以适应的规则   一个巨大的袋子的手掌   挂钩”。

python中几乎所有内容都遵循相同的简单标准。一切都是可访问,可更改和可调整的。语言级元素非常少。

以len(data)内置函数为例。 len(data)只需检查data.__len__()方法,然后调用它并返回值即可。这样,len()可以处理任何实现__len__()方法的对象。


首先了解类型和基本语法:

  1. 动态强类型语言
  2. bool,int,float,string,list,tuple,dict,set
  3. 陈述,缩进,“一切都是对象”
  4. 基本功能定义
  5. 然后继续学习python如何工作:

    1. 导入和模块(非常简单)
    2. python路径(sys.path)
    3. dir()功能
    4. __builtins__
    5. 一旦您了解了如何将各个部分组合在一起,请返回并介绍一些更高级的语言功能:

      1. 迭代
      2. 覆盖__len__(有很多这些)
      3. 列表理解和生成器
      4. 类和对象(一旦你知道一些规则,再一次非常简单)
      5. python继承规则
      6. 一旦你对这些项目感到满意(重点关注使它们成为pythonic的东西),请查看更具体的项目:

        1. 在python中进行线程处理(注意全局解释器锁)
        2. 上下文管理员
        3. 数据库访问
        4. file IO
        5. 插座
        6. 等...

        7. 永远不要忘记 Python的禅宗(Tim Peters)

          Beautiful is better than ugly.
          Explicit is better than implicit.
          Simple is better than complex.
          Complex is better than complicated.
          Flat is better than nested.
          Sparse is better than dense.
          Readability counts.
          Special cases aren't special enough to break the rules.
          Although practicality beats purity.
          Errors should never pass silently.
          Unless explicitly silenced.
          In the face of ambiguity, refuse the temptation to guess.
          There should be one-- and preferably only one --obvious way to do it.
          Although that way may not be obvious at first unless you're Dutch.
          Now is better than never.
          Although never is often better than *right* now.
          If the implementation is hard to explain, it's a bad idea.
          If the implementation is easy to explain, it may be a good idea.
          Namespaces are one honking great idea -- let's do more of those!
          

答案 1 :(得分:9)

此页面涵盖了所有主要的python习语:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

答案 2 :(得分:7)

Python中一个重要的习语是docstrings。

每个对象都有一个__doc__属性,可用于获取该对象的帮助。您可以在模块,类,方法和函数上设置__doc__属性,如下所示:

# this is m.py
""" module docstring """

class c:
    """class docstring"""
    def m(self):
        """method docstring"""
        pass

def f(a):
    """function f docstring"""
    return

现在,当您输入help(m)help(m.f)等时,它会将docstring打印为帮助消息。

因为它只是普通对象内省的一部分,所以可以通过文档生成系统(如epydoc)或单元测试用于测试目的来使用。

它也可以用于Dparser中更为非常规(即非惯用)的用法,例如语法。

对我来说更有趣的是,即使 doc 是大多数对象的只读属性,您也可以在任何地方使用它们:

x = 5
""" pseudo docstring for x """

和像epydoc这样的文档工具可以选择并正确格式化它们(而不是保留在代码格式中的普通注释。

答案 3 :(得分:6)

装饰者得到我的投票。你还能在哪里写下类似的东西:

def trace(num_args=0):
  def wrapper(func):
    def new_f(*a,**k):
      print_args = ''
      if num_args > 0:
        print_args = str.join(',', [str(x) for x in a[0:num_args]])
      print('entering %s(%s)' %(f.__name__,print_args))
      rc = f(*a,**k)
      if rc is not None:
        print('exiting %s(%s)=%s' %(f.__name__,str(rc)))
      else:
        print('exiting %s(%s)' %(f.__name__))
      return rc
    return new_f
  return wrapper

@trace(1)
def factorial(n):
  if n < 2:
    return 1
  return n * factorial(n-1)
factorial(5)

并获得如下输出:

entering factorial(5)
entering factorial(4)
entering factorial(3)
entering factorial(2)
entering factorial(1)
entering factorial(0)
exiting factorial(0)=1
exiting factorial(1)=1
exiting factorial(2)=2
exiting factorial(3)=6
exiting factorial(4)=24
exiting factorial(5)=120

答案 4 :(得分:4)

所有与列表使用相关的内容 理解,发电机等

答案 5 :(得分:3)

从更高级的角度来看,了解Python内部如何使用字典。类,函数,模块,引用都只是字典上的属性。一旦理解了这一点,就很容易理解如何修补补丁并使用强大的__gettattr __,__ setattr __和__call__方法。

答案 6 :(得分:3)

这是一个可以提供帮助的人。有什么区别:

[ foo(x) for x in range(0, 5) ][0]

( foo(x) for x in range(0, 5) ).next()

答案: 在第二个例子中,foo只被调用一次。如果foo有副作用,或者用于构造列表的iterable很大,这可能很重要。

答案 7 :(得分:3)

就个人而言,我真的喜欢使用缩进定义代码块的Python语法,而不是“BEGIN”和“END”这两个词(如Microsoft的Basic和Visual Basic中那样 - 我不喜欢这些)或者使用左括号和右括号(如C,C ++,Java,Perl - 我喜欢这些)。

这真让我感到惊讶,因为虽然缩进对我来说一直非常重要,但我并没有对它产生太大的“噪音” - 我和它一起生活,它被认为是一种能够阅读其他民族的技巧,“意大利面条”代码。此外,我从未听说过另一位程序员建议将缩进作为语言的一部分。直到Python!我只希望我先实现这个想法。

对我来说,就像Python的语法强迫你编写好的,可读的代码一样。

好的,我会离开我的肥皂盒。 ; - )

答案 8 :(得分:2)

特别是Pythonic让我感到震惊的两件事是动态类型和Python中使用的各种列表,尤其是元组。

Python的列表迷恋可以说是LISP-y,但它有自己独特的味道。像这样的一行:

return HandEvaluator.StraightFlush, (PokerCard.longFaces[index + 4], 
  PokerCard.longSuits[flushSuit]), []

甚至

return False, False, False

看起来像Python而已。 (从技术上讲,你也会在Lua中看到后者,但Lua一般都是Pythonic。)

答案 9 :(得分:2)

使用字符串替换:

name = "Joe"
age = 12
print "My name is %s, I am %s" % (name, age)

当我不使用python进行编程时,这种简单的用法是我最想念的。

答案 10 :(得分:1)

你无法及早开始的另一件事可能是测试。在这里,特别是doctests是一种通过同时解释代码来测试代码的好方法。

doctests是简单的文本文件,包含交互式解释器会话以及如下文本:

Let's instantiate our class::

>>> a=Something(text="yes")
>>> a.text
yes

Now call this method and check the results::

>>> a.canify()
>>> a.text
yes, I can

如果是a.text返回不同的测试失败的东西。

doctests可以在docstrings或独立文本文件中,并使用doctests module执行。当然,也可以使用更为人熟知的单元测试。

答案 11 :(得分:1)

我认为在线教程和书籍只谈论做事,而不是以最好的方式做事。除了python语法,我认为在某些情况下速度很重要。

Python提供了一种基准功能的方法,实际上是两个!!

一种方法是使用profile模块,如下所示:

import profile

def foo(x, y, z):
    return x**y % z # Just an example.

profile.run('foo(5, 6, 3)')

另一种方法是使用timeit模块,如下所示:

import timeit

def foo(x, y, z):
    return x**y % z # Can also be 'pow(x, y, z)' which is way faster.

timeit.timeit('foo(5, 6, 3)', 'from __main__ import *', number = 100) 
# timeit.timeit(testcode, setupcode, number = number_of_iterations)