Подтвердить что ты не робот

Что вы хотели бы знать о том, когда начали изучать Python?

Я решил изучить Python 3. Для тех, кто раньше был, что вы нашли наиболее полезным на этом пути и хотите, чтобы вы знали об этом раньше?

4b9b3361

Ответ 1

Я изучил Python еще до выпуска 1.5.2, поэтому вещи, которые были для меня ключевыми для меня тогда, могут быть не главными сегодня.

Это, как говорится, важная вещь, которая меня немного поняла, но теперь я считаю решающей: многие функциональные возможности, которые другие языки делают внутренне, фактически становятся доступными стандартной библиотекой и встроенными модулями.

Сам язык небольшой и простой, но пока вы не знакомы со встроенными модулями и "основными частями" стандартной библиотеки (например, в настоящее время sys, itertools, collections, copy,...), вы будете изобретать колесо снова и снова. Таким образом, чем больше времени вы инвестируете в ознакомление с этими частями, тем более плавным будет ваш прогресс. Каждый раз, когда у вас есть задача, которую вы хотите сделать, это, похоже, не поддерживается непосредственно языком, сначала спросите себя: какие встроенные модули или модули в стандартной библиотеке сделают задачу намного проще или даже сделать все это для меня? Иногда их не будет, но чаще всего вы найдете отличные решения, исходя из этого мышления.

Ответ 2

  • Мне жаль, что я не знаю Java.
  • Более функциональное программирование. (см. модуль itertools, понимание списка, map(), reduce() или filter())

Ответ 3

List comprehension (делает список чисто):

[x for x in y if x > z]

Расширение генератора (такое же, как понимание списка, но не оценивается до его использования):

(x for x in y if x > z)

Ответ 4

Два судорожных судороги. Один из них не относится к Python 3.

a = 095

Не работает. Зачем? Начальный ноль - восьмеричный литерал. 9 недействителен в восьмеричном литерале.

def foo( bar=[] ):
    bar.append( 1 )
    return bar

Не работает. Зачем? Измененный объект по умолчанию снова используется.

Ответ 5

  • Для enumerate.
  • Для seq = seq.append(item) и seq = seq.sort() установите seq на None.
  • Использование set для удаления дубликатов.
  • Довольно много всего в модулях itertools и collections.
  • Как работают префиксы * и ** для аргументов функции.
  • Как параметры аргументов по умолчанию работают внутри (т.е. что f.func_defaults).
  • Как (почему, действительно) создавать функции так, чтобы они были полезны в сочетании с map и zip.
  • Роль __dict__ в классах.
  • На самом деле import.

Ответ 6

Узнайте, как использовать iPython Он получил вкладку. Просмотрите все элементы в вашем пространстве имен "whos".

После импорта модуля легко просмотреть код:

>>> import os
>>> os?? # this display the actual source of the method
>>> help() # Python interactive help. Fantastic!

Большинство модулей Python хорошо документированы; в теории вы могли бы изучить iPython, а остальная часть того, что вам нужно знать, могла бы быть изучена с помощью одного и того же инструмента.

iPython также имеет режим отладки, pdb(). Наконец, вы даже можете использовать iPython в качестве командной строки с поддержкой python. Основные команды UNIX работают как% магических методов. Любые команды, которые не являются магической командой, могут быть выполнены:

>>> os.system('cp file1 file2')

Ответ 7

Не имеют имен переменных, которые являются типами. Например, не называйте переменную "файл" или "dict"

Ответ 8

Декораторы. Написание собственного - это не то, что вы, возможно, захотите сделать сразу, но зная, что @staticmethod и @classmethod доступны с самого начала (и разница между тем, что они делают) является реальным плюсом.

Ответ 9

  • с помощью help() в оболочке на любом объекте, классе или пути
  • вы можете запустить import code; code.interact(local=locals()) в любом месте вашего кода, и он запустит оболочку python в этой точной точке
  • вы можете запустить python -i yourscript.py, чтобы запустить оболочку в конце yourscript.py

Ответ 11

То, что кортеж одного элемента должен заканчиваться запятой или он не будет интерпретироваться как кортеж.

pprint() очень удобно (да, 2 p)

reload() полезен, когда вы повторно тестируете модуль, делая много быстрых изменений в зависимом модуле.

И выучите как можно больше обычных "идиом", иначе вы будете бить головой, пытаясь найти лучший способ сделать что-то, когда идиома действительно считается лучшим способом (например, уродливые выражения типа ' '.join(), или ответ на вопрос, почему нет функции isInt(string).... Ответ: вы можете просто обернуть использование "возможного" целого с помощью try: а затем поймать исключение, если оно не является допустимым int. ну, но это звучит как ужасный ответ, когда вы впервые сталкиваетесь с ним, поэтому вы можете потратить много времени на то, чтобы убедить себя, что это действительно хороший подход.

Вот некоторые вещи, которые потратили несколько часов на мое время, чтобы определить, что мой первый проект какого-то кода, который считался неправильным, действительно был приемлемым.

Чтения из python.org:

http://wiki.python.org/moin/BeginnerErrorsWithPythonProgramming http://wiki.python.org/moin/PythonWarts

Ответ 12

Список понятий, если вы приходите на новый Python (не из более ранней версии).

Ответ 13

Closures. Чистый и лаконичный, не прибегая к использованию шаблона стратегии, в отличие от языков, таких как Java

Ответ 14

Если вы узнаете из хорошей книги, она не только научит вас языку, но и научит вас распространенным идиомам. Идиомы ценны.

Например, здесь приведена стандартная идиома для инициализации экземпляра класса со списком:

class Foo(object):
    def __init__(self, lst=None):
        if lst is None:
            self.lst = []
        else:
            self.lst = lst

Если вы изучите это как идиому из книги, вам не нужно усердно учиться, почему это стандартная идиома. @S.Lott уже объяснил это: если вы попытаетесь сделать инициализатор по умолчанию пустым, пустой список будет оцениваться только один раз (во время компиляции), и каждый инициализированный по умолчанию экземпляр вашего класса получает тот же экземпляр списка, который не было тем, что предназначалось здесь.

Некоторые идиомы защищают вас от нежелательных эффектов; некоторые из них помогут вам получить лучшую производительность на языке; и некоторые из них являются лишь небольшими точками стиля, которые помогают другим поклонникам Python лучше понимать ваш код.

Я узнал из книги Learning Python и познакомил меня с некоторыми идиомами.

Вот веб-страница, посвященная идиомам: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

P.S. Код Python, который следует за наиболее практичными идиомами Python, часто называется кодом "Pythonic".

Ответ 15

Я реализовал множество рекурсивных прогулок по каталогам вручную, прежде чем узнал о os.walk()

Ответ 17

Одной из самых крутых вещей, о которых я недавно узнал, был модуль команд:

>>> import commands
>>> commands.getoutput('uptime')
'18:24  up 10:22, 7 users, load averages: 0.37 0.45 0.41'

Это похоже на os.popen или os.system, но без всех исключений DeprecationWarnings.

И не забывайте PDB (отладчик Python):

% python -m pdb poop.py

Ответ 18

Переход в интерактивный режим в IPython

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell()

Ответ 19

Когда я начал с python, начал с основных методов из примеров. Это произошло потому, что я не знал, что лучше, после чего я нашел this о том, как создать лучший основной метод.

Ответ 20

Мне жаль, что я не знал, как правильно писать код в Python. Вы можете выбрать любой язык, который вам нравится, и начать кодирование в нем, как на C, Java и т.д., Но в идеале вы научитесь кодировать "дух" языка. Python особенно уместен, поскольку я думаю, что он имеет определенный собственный стиль.

В то время как я нашел это немного позже в моей карьере Python, чем мне бы хотелось, эта замечательная статья охватывает многие идиомы Python и небольшие трюки, которые делают ее особенной. Некоторые из вещей, о которых люди упоминали в своих ответах до сих пор, содержатся в: Код Как Pythonista: Идиоматический Python.

Наслаждайтесь!

Ответ 21

Последовательный импорт перезаписывается:

Если вы импортируете два файла, например:

from foo import *
from bar import *

Если обе функции foo.py и bar.py имеют функцию с именем fubar(), то при импорте файлов таким образом, когда вы вызываете fubar, будет выполняться fubar, как определено в bar.py. Лучший способ избежать этого - сделать это:

import foo
import bar

а затем вызовите foo.fubar или bar.fubar. Таким образом, вы ВСЕГДА знаете, какое определение файла fubar будет выполнено.

Ответ 22

Возможно, более продвинутый, но мне жаль, что я не знал, что вы не используете потоки, чтобы использовать несколько ядер в (C) python. Вы используете библиотеку multiprocessing.

Ответ 23

Завершение табуляции и общая поддержка readline, включая истории, даже в обычной оболочке python.

$ cat ~/.pythonrc.py 
#!/usr/bin/env python

try:
    import readline
except ImportError:
    print("Module readline not available.")
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

    import os
    histfile = os.path.join(os.environ["HOME"], ".pyhist")
    try:
        readline.read_history_file(histfile)
    except IOError:
        pass
    import atexit
    atexit.register(readline.write_history_file, histfile)
    del os, histfile

а затем добавьте строку в ваш .bashrc

export PYTHONSTARTUP=~/.pythonrc.py

Эти две вещи приводят к поисковому стилю программирования "похоже, что эта библиотека может делать то, что я хочу", поэтому я запускаю оболочку python, а затем провожу вокруг с помощью команды tab-completion и help() до тех пор, пока я найти то, что мне нужно.

Генераторы и список понятий более полезны, чем вы думаете. Не просто игнорируйте их.

Ответ 24

Хотелось бы, чтобы я хорошо знал функциональный язык. Проиграв немного с Clojure, я понял, что многие функциональные идеи Python заимствованы из Lisp или других функциональных языков

Ответ 25

Довольно печать:

>>> print "%s world" %('hello')
hello world

% s для строки

% d для целого числа

% f для float

%. xf для ровно x много десятичных знаков поплавка. Если float имеет меньшие десятичные числа, которые указываются, то добавляются 0s

Ответ 26

Мне очень нравится понимание списков и все другие полужесткие конструкции. Хотелось бы, чтобы я знал это, когда был в моем первом проекте Python.

Ответ 27

Что мне действительно понравилось: список понятий, закрытий (и функций высокого порядка), кортежей, лямбда-функций, безболезненных биноклей.

Чего я хотел бы знать раньше: тот факт, что использование идиом Python в коде (например, для списков, а не для циклов над списками) было быстрее.

Ответ 28

Это многоядерное будущее. Все еще люблю Питона. Он пишет для меня мой код.

Ответ 29

Функциональные инструменты программирования, такие как all и any