Я редко использую утверждения для чего-либо другая та проверка типа времени компиляции. Я использовал бы исключение вместо утверждения просто, потому что большинство языков создается для обработки их.
я предлагаю пример
file = create-some-file();
_throwExceptionIf( file.exists() == false, "FILE DOES NOT EXIST");
против
file = create-some-file();
ASSERT(file.exists());
, Как приложение обработало бы утверждение? Я предпочитаю старое try catch
метод контакта с фатальными ошибками.
Я изучал Python еще до выпуска 1.5.2, поэтому то, что было для меня ключевым в то время, возможно, не было ключевые вещи сегодня.
Это, как уже было сказано, важная вещь, на осознание которой мне потребовалось немного времени, но теперь я считаю критически важной: многие функции, которые другие языки сделали бы внутренними, на самом деле предоставляются стандартной библиотекой и встроенными модулями .
Сам язык небольшой и простой, но пока вы не знакомы со встроенными модулями и «основными частями» стандартной библиотеки (например, в настоящее время sys
, itertools
, коллекции
, копия
, ...), вы » Я буду изобретать велосипед снова и снова. Итак, чем больше времени вы потратите на ознакомление с этими частями, тем более плавным будет ваш прогресс. Каждый раз, когда у вас есть задача, которую вы хотите выполнить, которая, похоже, напрямую не поддерживается языком, сначала спросите себя: какие встроенные модули или модули в стандартной библиотеке сделают задачу намного проще или даже сделают все это для меня? Иногда их не бывает, но чаще всего вы найдете отличные решения, если будете придерживаться этого мышления.
За многоядерностью было будущее. Все еще люблю Python. Он пишет за меня значительную часть моего кода.
Что мне действительно понравилось: понимание списков, замыкания (и функции высокого порядка), кортежи, лямбда-функции, безболезненные большие числа.
О чем мне хотелось бы узнать раньше: о том, что использование идиом Python в коде (например, понимание списков вместо циклов по спискам) было быстрее.
Мне очень нравится понимание списков и все другие полуфункциональные конструкции. Мне жаль, что я не знал их, когда я был в моем первом проекте Python.
Хотел бы я сразу знать, как идиоматически кодировать на Python. Вы можете выбрать любой язык, который вам нравится, и начать кодировать на нем, например C, Java и т. Д., Но в идеале вы научитесь кодировать в «духе» этого языка. Python особенно актуален, поскольку я думаю, что у него есть свой собственный стиль.
Хотя я обнаружил его немного позже в моей карьере Python, чем мне бы хотелось, эта отличная статья завершает многие идиомы Python и небольшие уловки, которые сделай это особенным. Некоторые из вещей, которые люди упомянули в своих ответах, содержатся в: Код как Pythonista: Идиоматический Python .
Наслаждайтесь!
Когда я начал с python, начал с основных методов из примеров. Это произошло потому, что я ничего не знал, после этого я нашел это о том, как создать лучший основной метод.
Одной из самых крутых вещей, о которых я недавно узнал, был модуль команд:
>>> import commands
>>> commands.getoutput('uptime')
'18:24 up 10:22, 7 users, load averages: 0.37 0.45 0.41'
Это похоже на os.popen или os.system, но без всех предупреждений об устаревании.
И давайте не забывать PDB (отладчик Python):
% python -m pdb poop.py
Хотел бы я хорошо знать функциональный язык. Немного поиграв с Clojure, я понял, что многие функциональные идеи Python заимствованы из Lisp или других функциональных языков
Переход в интерактивный режим в IPython
from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell()
Я реализовал множество рекурсивных обходов каталогов вручную, прежде чем узнал о os.walk ()
Если вы учитесь по хорошей книге, она не только научит вас языку, но и научит распространенным идиомам. Идиомы очень полезны.
Например, вот стандартная идиома для инициализации экземпляра класса списком:
class Foo(object):
def __init__(self, lst=None):
if lst is None:
self.lst = []
else:
self.lst = lst
Если вы выучите это как идиому из книги, вам не придется усердно изучать , почему это стандартная идиома. @ S.Lott уже объяснил это: если вы попытаетесь сделать инициализатор по умолчанию пустым списком, пустой список оценивается только один раз (во время компиляции), и каждый инициализированный по умолчанию экземпляр вашего класса получит то же самое список экземпляров, который здесь не предназначался.
Некоторые идиомы защищают вас от непреднамеренных эффектов; некоторые помогут вам добиться максимальной производительности от языка; а некоторые - всего лишь мелочи стиля,
Закрытия. Чисто и кратко, без необходимости прибегать к использованию шаблона стратегии в отличие от таких языков, как Java
Составьте список , если вы переходите на Python только что (не из более ранней версии).
Декораторы. Написание собственного - это не то, чем вы, возможно, захотите сразу заняться, но зная, что @staticmethod
и @classmethod
доступны с самого начала (и разница между тем, что они делают), это реальный плюс.
Наиболее полезно: Dive Into Python . Как отмечает комментатор, если вы изучаете Python 3, Dive Into Python 3 более применимо.
Известно о более раннем: virtualenv .
help ()
в оболочке для любого объекта, класса или пути код импорта;
code.interact (local = locals ())
в любом месте вашего кода, и он запустит оболочку python именно в этой точке python -i yourscript.py
, чтобы запустить оболочку в конце yourscript.py Что кортеж одного элемента должен заканчиваться запятой, иначе он не будет интерпретирован как кортеж.
pprint ()
очень удобен (да, 2 p)
reload ()
полезен, когда вы повторно тестируете модуль, одновременно внося множество быстрых изменений в зависимый модуль.
И выучите как можно больше распространенных «идиом», иначе вы будете биться головой в поисках лучшего способа что-то сделать, когда идиома действительно считается лучшим способом (например, уродливые выражения вроде ' '.join ()
, или ответ на вопрос, почему нет функции isInt (string)
.... ответ в том, что вы можете просто обернуть использование «возможного» целого числа с помощью попытки : а затем перехватить исключение, если это недействительный int. Решение работает хорошо, но когда вы впервые сталкиваетесь с этим, это звучит как ужасный ответ, поэтому вы можете потратить много времени, убеждая себя, что это действительно хороший подход.
Это некоторые вещи, на которые я потратил несколько часов моего времени, чтобы определить, что мой первый набросок некоторого кода, который казался неправильным, действительно был приемлемым.
Показания с сайта python.org:[12122ghthttp://wiki.python.org/moin/BeginnerErrorsWithPythonProgramming http://wiki.python.org/moin/PythonWarts[12124 provided
Узнайте, как использовать iPython У него есть завершение табуляции. Просмотрите все элементы в вашем пространстве имен с помощью «whos».
После импорта модуля легко просмотреть код:
>>> import os
>>> os?? # this display the actual source of the method
>>> help() # Python's interactive help. Fantastic!
Большинство модулей Python хорошо документированы; Теоретически вы можете изучить iPython, а все остальное, что вам нужно знать, можно изучить с помощью того же инструмента.
iPython также имеет режим отладки, pdb (). Наконец, вы даже можете использовать iPython в качестве командной строки с поддержкой Python. Базовые команды UNIX работают как% magic методы. Могут быть выполнены любые команды, которые не являются волшебными:
>>> os.system('cp file1 file2')
Не используйте имена переменных, которые являются типами. Например, не называйте переменную "файл" или "dict"
я предпочитаю
kill -9 `cat pid`
, который будет работать для любой команды в обратных кавычках.
Две вещи, вызывающие спазмы мозга. Один из них не относится к Python 3.
a = 095
Не работает. Почему? Начальный ноль - восьмеричный литерал. Число 9 в восьмеричном литерале недопустимо.
def foo( bar=[] ):
bar.append( 1 )
return bar
Не работает. Почему? Изменяемый объект по умолчанию используется повторно.
Понимание списка (аккуратное создание списка):
[x for x in y if x > z]
Расширение генератора (то же, что и понимание списка, но не выполняется до тех пор, пока оно не будет использовано):
(x for x in y if x > z)
Хорошая печать:
>>> print "%s world" %('hello')
hello world
% s для строки
% d для целого числа
% f для числа с плавающей запятой
%. Xf для ровно x количества десятичных знаков числа с плавающей запятой. Если число с плавающей точкой меньше указанного, то добавляются нули
Завершение табуляции и общая поддержка строки чтения, включая истории, даже в обычной оболочке 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, а затем ковыряюсь, используя завершение табуляции и команду help (), пока не найду то, что мне нужно.
Генераторы и список понимание более полезно, чем вы думаете. Не игнорируйте их.
Может быть, немного более продвинутый, но я хотел бы знать, что вы не используете потоки для использования преимуществ нескольких ядер в ( В) питон. Вы используете многопроцессорную библиотеку
.
Последовательный импорт перезаписывается:
Если вы импортируете два файла следующим образом:
from foo import *
from bar import *
Если и foo.py, и bar.py имеют функцию с именем fubar (), импортировав файлы, это Таким образом, когда вы вызываете fubar, будет выполнен fubar, как определено в bar.py. Лучший способ избежать этого - сделать следующее:
import foo
import bar
и затем вызвать foo.fubar или bar.fubar. Таким образом, вы ВСЕГДА знаете, какое определение файла fubar будет выполнено.