Jakie są ważne cechy językowe (idiomy) Pythona do nauki na wczesnym etapie [duplicate]

To pytanie ma już odpowiedź tutaj:

Chciałbym wiedzieć, co społeczność StackOverflow uważa za ważne cechy języka (idiomy) Pythona. Funkcje, które definiowałyby programistę jako Pythonic.

Idiom Python (pythonic) - "wyrażenie kodu", które jest naturalne lub charakterystyczne dla języka Python.

Dodatkowo, jakich idiomów powinni się nauczyć wszyscy programiści Pythona na początku?

Z góry dzięki

Powiązane:

Author: Community, 2009-02-20

12 answers

Python jest językiem, który można opisać jako:

"zasady, które możesz zmieścić w dłoni z ogromnym workiem z haki".

Prawie wszystko w Pythonie jest zgodne z tymi samymi prostymi standardami. Wszystko jest dostępne, zmienne i można je dostosować. Istnieje bardzo niewiele elementów poziomu językowego.

Weźmy na przykład wbudowaną funkcję len (data). len(data) działa po prostu sprawdzając metodę data.__len__(), a następnie wywołując ją i zwracając wartość. W ten sposób, len() może pracować na dowolnym obiekcie implementującym metodę __len__().


Zacznij od Poznania typów i podstawowej składni:

  1. Dynamiczne Silnie Typowane Języki
  2. bool, int, float, string, list, tuple, dict, set
  3. stwierdzenia, wcięcia, "wszystko jest przedmiotem"
  4. podstawowe definicje funkcji

Następnie przejdź do nauki o tym, jak działa python:

  1. import i moduły (naprawdę proste)
  2. ścieżka Pythona (sys.ścieżka)
  3. Funkcja dir()
  4. __builtins__

Gdy już zrozumiesz, jak dopasować elementy do siebie, wróć i przejrzyj niektóre z bardziej zaawansowanych funkcji językowych:]}

  1. Iteratory
  2. nadpisuje jak __len__ (jest ich mnóstwo)
  3. składanie listy i generatory
  4. klasy i Obiekty (znowu, naprawdę proste, gdy znasz kilka zasad)
  5. zasady dziedziczenia Pythona

A gdy już masz poziom komfortu z tymi przedmiotami (z naciskiem na to, co sprawia, że są pythoniczne), spójrz na bardziej konkretne przedmioty:

    [[22]} Threading w Pythonie (zwróć uwagę na globalną blokadę interpretera)
  1. Menedżery kontekstu
  2. dostęp do bazy danych
  3. plik IO
  4. gniazda
  5. itd...

Nie zapominaj nigdy o Zen Pythona (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!
 24
Author: gahooa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 21:52:59

Ta strona obejmuje wszystkie główne idiomy Pythona: http://python.net / ~goodger/projects/pycon/2007/idiomatic/handout.html

 9
Author: CTT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 21:36:47

Ważnym idiomem w Pythonie jest docstrings.

Każdy obiekt ma atrybut _ _ doc__, który może być użyty do uzyskania pomocy na tym obiekcie. Możesz ustawić atrybut __doc_ _ na modułach, klasach, metodach i funkcjach w następujący sposób:

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

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

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

Teraz, kiedy wpisujesz help(m), help(m.f) itd. wydrukuje docstring jako wiadomość pomocy.

Ponieważ jest to tylko część normalnej introspekcji obiektu, może to być używane przez systemy generujące dokumenty, takie jak epydoc lub używane do celów testowych przez unittest.

Może być również stosowany do bardziej niekonwencjonalnych (tj. nie-idiomatycznych) zastosowań, takich jak gramatyki w Dparser.

Jeszcze bardziej interesujące jest to, że chociaż doc jest atrybutem tylko do odczytu na większości obiektów, możesz ich używać wszędzie w ten sposób:

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

I narzędzia dokumentacji, takie jak epydoc , mogą je podnieść i odpowiednio sformatować (w przeciwieństwie do normalnego komentarza, który pozostaje wewnątrz formatowania kodu.

 7
Author: Van Gale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 22:33:13

Dekoratorzy dostają mój głos. Gdzie jeszcze można napisać coś w stylu:

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)

I get output like:

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
 6
Author: D.Shawley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 22:27:08

Wszystko co związane z użytkowaniem listy.
Agregaty, Generatory itp.

 4
Author: Roberto Liffredo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 21:32:59

Z bardziej zaawansowanego punktu widzenia, zrozumienie, w jaki sposób słowniki są używane wewnętrznie przez Pythona. Klasy, funkcje, Moduły, referencje to tylko właściwości w słowniku. Gdy to zrozumiemy, łatwo będzie zrozumieć, jak wykonać łatkę i użyć potężnych metod _ _ gettattr__, _ _ setattr _ _ I _ _ call__.

 3
Author: Van Gale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 21:44:02

Oto jeden, który może pomóc. Jaka jest różnica między:

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

I

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

Odpowiedź: w drugim przykładzie foo jest wywoływane tylko raz. Może to być ważne, jeśli foo ma efekt uboczny lub jeśli iterable używany do konstruowania listy jest duży.

 3
Author: SingleNegationElimination,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 01:21:48

Osobiście bardzo lubię Definiowanie bloków kodu w Pythonie za pomocą wcięcia, a nie za pomocą słów "BEGIN" I "END" (jak w Basic i Visual Basic Microsoftu - nie lubię tych) lub za pomocą lewego i prawego klamry (jak w C, C++, Java, Perl - lubię te).

To naprawdę mnie zaskoczyło, bo chociaż wcięcia zawsze były dla mnie bardzo ważne, nie robiłam na to zbyt wiele "hałasu" - żyłam z tym, a umiejętność czytania innych jest uważana za umiejętność ludzie, kod "spaghetti". Co więcej, nigdy nie słyszałem, aby inny programista sugerował, aby wcięcia stały się częścią języka. Aż Do Pytona! Żałuję tylko, że nie zrealizowałem tego pomysłu jako pierwszy.

Dla mnie to tak, jakby składnia Pythona zmuszała do pisania dobrego, czytelnego kodu.

Dobra, zejdę z mydelniczki. ;-)

 3
Author: John Ewing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-06 00:50:50

Dwie rzeczy, które uderzyły mnie jako szczególnie Pythoniczne, to dynamiczne pisanie i różne smaki list używanych w Pythonie, szczególnie krotki.

Obsesja listy Pythona można powiedzieć, że jest LISP-y, ale ma swój własny, unikalny smak. Wiersz jak:

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

Lub nawet

return False, False, False
Wygląda jak Python i nic więcej. (Technicznie rzecz biorąc, to drugie można zobaczyć również w Lua, ale Lua jest ogólnie dość Pythoniczna.)
 2
Author: Yes - that Jake.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 21:38:49

Using string substitutions:

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

Kiedy nie programuję w Pythonie, tego prostego użycia najbardziej mi brakuje.

 2
Author: Oliver Kiel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 03:27:30

Kolejną rzeczą, której nie możesz zacząć wystarczająco wcześnie, jest prawdopodobnie testowanie. Tutaj szczególnie doctesty są świetnym sposobem na przetestowanie kodu, wyjaśniając go jednocześnie.

Doctesty to prosty plik tekstowy zawierający interaktywną sesję interpretera oraz tekst taki jak ten:

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

Jeśli np. a. text zwróci coś innego, test się nie powiedzie.

Doctesty mogą być wewnątrz docstrings lub samodzielnych plików tekstowych i są wykonywane za pomocą modułu doctests . Oczywiście dostępne są również bardziej znane testy jednostkowe.

 1
Author: MrTopf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 23:57:24

Myślę, że poradniki online i książki mówią tylko o robieniu rzeczy, a nie robieniu rzeczy w najlepszy sposób. Wraz ze składnią Pythona uważam, że szybkość w niektórych przypadkach jest ważna.

Python zapewnia sposób na testowanie funkcji, właściwie dwóch!!

Jednym ze sposobów jest użycie modułu profile w następujący sposób:

import profile

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

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

Innym sposobem jest użycie modułu timeit, Tak:

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)
 1
Author: alexpinho98,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-05 17:27:57