Python的重要语言特性(习语)是什么

Python的重要语言特性(习语)是什么,python,idioms,Python,Idioms,我想知道StackOverflow社区认为Python的重要语言特性(习惯用法)是什么。将程序员定义为Pythonic的特性 Python(pythonic)习语——“代码表达式”,是Python语言的自然或特征 另外,所有Python程序员应该尽早学习哪些习惯用法? 提前谢谢 相关的: 与列表用法相关的所有内容。 理解、生成器等。本页涵盖了所有主要的python习惯用法:让我印象特别深刻的两件事是动态类型和python中使用的各种列表,特别是元组 Python对列表的痴迷可以说是LISP

我想知道StackOverflow社区认为Python的重要语言特性(习惯用法)是什么。将程序员定义为Pythonic的特性

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

另外,所有Python程序员应该尽早学习哪些习惯用法?

提前谢谢

相关的:


与列表用法相关的所有内容。

理解、生成器等。

本页涵盖了所有主要的python习惯用法:

让我印象特别深刻的两件事是动态类型和python中使用的各种列表,特别是元组

Python对列表的痴迷可以说是LISP-y,但它有自己独特的风格。像这样的一行:

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

return False, False, False

只是看起来像Python,其他什么都没有。(从技术上讲,在Lua中也可以看到后者,但Lua通常是相当Pythonic的。)

从更高级的角度来看,理解Python如何在内部使用词典。类、函数、模块和引用都只是字典上的属性。一旦理解了这一点,就很容易理解如何使用强大的uuu getAttr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu和uuuuuuuuuu call\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

“你能适应的规则 手掌上放着一大袋 钩子”

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

例如,len(数据)内置函数
len(data)
只需检查
data.\uu len\uu()
方法,然后调用它并返回值。这样,
len()
就可以在任何实现
\uuuu len\uuuu()
方法的对象上工作


首先学习类型和基本语法:

  • 动态强类型语言
  • bool、int、float、string、list、tuple、dict、set
  • 语句,缩进,“一切都是对象”
  • 基本函数定义
  • 然后继续学习python的工作原理:

  • 导入和模块(非常简单)
  • python路径(sys.path)
  • dir()
    函数
  • \uuuu内置\uuuuu
  • 一旦您了解了如何将各个部分组合在一起,请返回并介绍一些更高级的语言功能:

  • 迭代器
  • \uuuu len\uuuu
    这样的覆盖(有很多)
  • 列出理解和生成器
  • 类和对象(同样,一旦您了解了一些规则,就非常简单)
  • python继承规则
  • 一旦你对这些物品有了一个舒适度(关注是什么让它们变得像蟒蛇),看看更具体的物品:

  • python中的线程(注意全局解释器锁)
  • 上下文管理器
  • 数据库访问
  • 文件IO
  • 插座
  • 等等

  • 永远不要忘记Python的禅宗(蒂姆·彼得斯)


    装饰师得到我的选票。你还可以在其他地方写一些类似的东西:

    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)
    

    Python中的一个重要习惯用法是docstrings

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

    # this is m.py
    """ module docstring """
    
    class c:
        """class docstring"""
        def m(self):
            """method docstring"""
            pass
    
    def f(a):
        """function f docstring"""
        return
    
    x = 5
    """ pseudo docstring for x """
    
    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
    
    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)
    
    现在,当您键入
    help(m)
    help(m.f)
    等时,它会将文档字符串打印为帮助消息

    因为它只是普通对象内省的一部分,所以可以由文档生成系统(如epydoc)使用,也可以由unittest用于测试目的

    它也可以用于更非常规(即非惯用)的用途,如英语中的语法

    我更感兴趣的是,尽管在大多数对象上,doc是只读属性,但您可以在任何地方使用它们,如下所示:

    # this is m.py
    """ module docstring """
    
    class c:
        """class docstring"""
        def m(self):
            """method docstring"""
            pass
    
    def f(a):
        """function f docstring"""
        return
    
    x = 5
    """ pseudo docstring for x """
    
    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
    
    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)
    

    文档工具(如doctest)可以提取它们并正确设置它们的格式(而不是保留在代码格式中的普通注释)。

    另一件你不能尽早开始的事情可能是测试。这里特别是doctest是一种通过同时解释代码来测试代码的好方法

    doctest是一个简单的文本文件,包含一个交互式解释器会话和如下文本:

    # this is m.py
    """ module docstring """
    
    class c:
        """class docstring"""
        def m(self):
            """method docstring"""
            pass
    
    def f(a):
        """function f docstring"""
        return
    
    x = 5
    """ pseudo docstring for x """
    
    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
    
    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)
    
    如果例如a.text返回不同的内容,则测试将失败


    doctest可以位于docstring或独立文本文件中,并通过使用执行。当然,也可以使用更知名的单元测试。

    这里有一个可以帮助您。两者之间的区别是什么:

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

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

    使用字符串替换:

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

    当我不在Python编程时,简单的使用是我最怀念的。

    < P>个人,我很喜欢用缩进定义Python语法,而不是用“开始”和“结束”(如微软的Basic和Visual Basic——我不喜欢这些)或者使用左、右括号(如C、C++、java、Perl—I一样)。 这真的让我很惊讶,因为尽管缩进对我来说一直很重要,但我并没有对它制造太多的“噪音”——我和它一起生活,而且它被认为是一种能够读懂别人的“意大利面”的技能此外,我从未听过其他程序员建议将缩进作为语言的一部分。直到Python!我只希望我首先意识到这个想法

    对我来说,这就好像Python的语法迫使您编写好的、可读的代码


    好吧,我要离开我的肥皂盒。;-

    我认为在线教程和书籍只谈论做事,而不是用最好的方式做事。随着