Фрагменты предполагают некоторое знакомство с терминологией Python и Blender. Если вы новичок в Python, вы можете освоить множество техник, экспериментируя с примерами и ломая / исправляя / дополняя их. Целью здесь является не только обучение Python, но ссылки на документы Python, когда это имеет смысл. Некоторые из этих фрагментов написаны для одноразовых проектов, другие взяты из кода, собранного на Blenderscripting.blogspot, или ответов, приведенных на Blender.stackexchange.
Добро пожаловать в вики Blender Python Recipes!
кураторские и самоуверенные фрагменты для bpy
(работа продолжается, пока не появится это сообщение)
кураторские и самоуверенные фрагменты для bpy
(работа продолжается, пока не появится это сообщение)
Примеры сценариев перечислены в разделе справа. Используйте выпадающее меню страниц (со стрелкой), если вам нужен поиск по термину.
означает, что я не уделяю этому много времени
означает, что некоторый контент был добавлен, но есть больше, откуда это взялось
- no emojii означает, что пока все в порядке.
Почему Рецепты? Документация в основном генерируется автоматически и имеет тенденцию быть (октябрь 2015) довольно редкий на деталях; это хорошо для большинства уверенных в себе руководителей питонов, но люди, пытающиеся выучить питон и получить больше пользы от просмотра множества коротких примеров. Вики на основе github markdown - это удобный способ сбора фрагментов кода и предоставления людям возможности вносить обновления и исправления.
bpybpy
Кто?
Фрагменты предполагают некоторое знакомство с терминологией Python и Blender. Если вы новичок в Python, вы можете освоить множество техник, экспериментируя с примерами и ломая / исправляя / дополняя их. Целью здесь является не только обучение Python, но ссылки на документы Python, когда это имеет смысл.
Фрагменты предполагают некоторое знакомство с терминологией Python и Blender. Если вы новичок в Python, вы можете освоить множество техник, экспериментируя с примерами и ломая / исправляя / дополняя их. Целью здесь является не только обучение Python, но ссылки на документы Python, когда это имеет смысл.
Какая?
Некоторые из этих фрагментов написаны для одноразовых проектов, другие взяты из кода, собранного на Blenderscripting.blogspot, или ответов, приведенных на Blender.stackexchange.
Некоторые из этих фрагментов написаны для одноразовых проектов, другие взяты из кода, собранного на Blenderscripting.blogspot, или ответов, приведенных на Blender.stackexchange.
Делать вклад?
Я не заинтересован в том, чтобы делать это один. Создайте новую тему о теме, если считаете, что ее можно дополнить дополнительной информацией. Содержимое не будет включено без согласия того, кто написал код, я буду предполагать, что все участники имеют право представить код, если найденные материалы игнорируют этот запрос, они будут переписаны или удалены.
Я не заинтересован в том, чтобы делать это один. Создайте новую тему о теме, если считаете, что ее можно дополнить дополнительной информацией. Содержимое не будет включено без согласия того, кто написал код, я буду предполагать, что все участники имеют право представить код, если найденные материалы игнорируют этот запрос, они будут переписаны или удалены.
GeneralPythonSnippets
Это ускоренный курс в подмножестве Python. Если вы уже освоили их, вы не должны тратить время на чтение, если только вы не хотите проверить на наличие опечаток или фактических неточностей.
Любая комбинация следующих тем будет присутствовать в полезных скриптах Python. Эта страница надеется познакомить вас с общими набросками языка Python и будет содержать ссылки для получения более подробной информации. Нет смысла подробно рассказывать в начале процесса обучения, поэтому я быстро расскажу о них.
Это нормально, если это не имеет большого смысла. Если вы что-то не понимаете, помните, что то, как мы пишем вещи, часто является конвенцией, потому что конвенция должна была существовать (например, если вы посмотрите на карту Африки и увидите границы прямых линий, которые не имеют отношения к географии, - что что все это точно, это реальность, которая существует только в умах людей, которые видели эти карты.
Следуйте в консоли Blender's Python. Умение печатать точно очень важно для программирования.
Как запустить этот код
(подробно): Откройте Blender и откройте вид консоли Python. Вы заметите
>>>, это подсказка, ожидающая от вас ввода текста. Ниже мы будем вводить вещи после приглашения, затем нажимать Enter, чтобы запустить его.Распечатать
Пока ты учишься, Python
print()твой друг. Он попытается отобразить все, что находится между круглыми скобками ( ).>> > печать ( « Привет ученик » )
... Привет подмастерье
print()На этой странице я часто буду возвращаться, чтобы показать, как отображать информацию, которая будет вам полезна при кодировании.целое число
Целые числа, положительные или отрицательные. Вы увидите много таких по мере продвижения.
# Давайте создадим переменную под названием HAL
>> > гал = 3000
>> > печать (гал * 3 )
... 9000
поплавок
Числа, подобные этим
Вы также можете увидеть научную запись для небольших чисел, а именно,
100.0, 0.0000003и 34.4. и т. д. Вы часто будете видеть необычные поплавки, например, 0.00200023423когда ожидаете увидеть просто 0.002, это нормально и будет объяснено позже.Вы также можете увидеть научную запись для небольших чисел, а именно,
2e-7что эквивалентно 0.0000002.
О поплавках можно сказать гораздо больше, но редко имеет смысл говорить о них в изоляции. Вы увидите больше ссылок на поплавки ниже.
строка
Слова, которые вы сейчас читаете, являются строками. В Python мы выражаем строки, заключая их в одинарные qoutes, двойные qoutes или тройные qoutes.
>> > my_first_string = " Я HAL 9000 компьютер "
>> > my_second_string = ' Я HAL 9000 компьютер '
>> > my_third_string = "" " Я HAL 9000 компьютер """
Вы можете добавлять строки вместе, мы называем это «конкатенация»:
# обратите внимание на пробелы в конце строки, почему это так?
>> > var1 = " Я "
>> > var2 = " HAL "
>> > var3 = " 9000 компьютер "
>> > печать (var1 + var2 + var3)
... Я HAL 9000 компьютер
преобразование не строки в строку выполняется явно с помощью
str():>> > some_number = 9000
>> > " Hal " + ул (some_number)
... " Hal 9000 " `
Дальнейшие манипуляции со строками обсуждаются на более позднем этапе. Строки часто используются в Python, но в Blender они обычно используются для именования объектов, данных или установки свойств данных.
кортеж
Это тип данных, который используется для сбора данных, он содержит любые данные, которые вы хотите. Вы увидите кортеж, определенный различными способами.
>> > some_number = 20
>> > tuple_one = ( ' some_string ' , some_number, 0,3444 )
... ( ' some_string ' , 20 , 0,3444 )
но это нормально, чтобы удалить окружающие скобки, разделитель запятых является наиболее важным
>> > tuple_two = ' some_string ' , some_number, 0,3444
>> > tuple_two
... ( ' some_string ' , 20 , 0,3444 )
Вы также увидите, что это написано так, но это не распространено.
>> > tuple_three = кортеж ([ ' some_string ' , some_number, 0,3444 ])
Кортеж неизменен . Это означает, что вы не можете изменить ни один из членов кортежа, после того, как он создан, его нельзя изменить - даже если кортеж был создан с переменными. Если вы изменяете переменную, содержимое кортежа не обновляется. Посмотрите, что произойдет, когда мы обновим var2 для хранения новой строки
SAL .>> > var1 = " Я "
>> > var2 = " HAL "
>> > var3 = " 9000 компьютер "
>> > tuple_four = var1, var2, var3
>> > tuple_four
... ( ' Я ' , ' HAL ' , ' 9000 компьютер ' )
>> > var2 = 'SAL '
>> >var4
... ( « Я - это » , « HAL » , « 9000 компьютер » )
Чтобы изменить кортеж, вы должны назначить новый кортеж, переписав кортеж, сохраненный в
var4.>> > var4 = (var1, var2, var3)
>> > var4
... ( ' Я ' , ' SAL ' , ' 9000 компьютер ' )
Если вы обнаружите необходимость обновления членов коллекции, вы можете использовать
Listвместо этого.список
Списки - это очень большая тема, но вам не нужно много о них знать, чтобы делать полезные вещи. Списки похожи на кортежи, но с некоторыми важными отличиями. Во-первых, для обозначения списки используют квадратные скобки
[ ]для включения своих данных. Они не являются обязательными, поскольку они с кортежами.>> > my_list = [ 0 , 1 , 2 , 30 , 34 ]
>> > my_other_list = [ 0,9 , 1 , 2 , " 30 " , " тридцать девять " ]
списки изменчивы, вы можете изменить содержимое списков, не назначая новый список переменной. Элементы списка также называются членами . Я буду использовать два термина взаимозаменяемо. Вы можете указать Python, какой элемент изменить, используя индекс элемента. Первый элемент имеет индекс 0 (ноль), второй элемент имеет индекс 1 (один). и т.д ... Десятый элемент имеет индекс 9 (девять). Почему выкл на одну разницу? - потому что элементы или проиндексированы, начиная с 0, это называется «нулевая индексация». Большинство языков программирования делают это таким образом. Это соглашение, вы будете делать ошибки - мы все в какой-то момент совершаем одни ошибки.
Чтобы сообщить Python, что вы хотите использовать или изменить элемент, вы используете скобочную запись.
>> > some_list = [ 30 , 40 , 20 ]
>> > some_list [ 1 ] # Индекс позволяет искать второй элемент, он имеет 1
... 40
как насчет изменения значения, хранящегося в элементе? легко!
>> > my_new_list = [ 30 , 40 , 50 ]
>> > my_new_list [ 0 ] = ' Первый элемент Изменено '
>> > my_new_list
... [ ' Первый элемент изменен ' , 40 , 50 ]
вложенные списки
Нередко есть вложенные списки или многомерные списки.
>> > my_nested_list = [ 20 , 30 , my_list]
>> > my_nested_list
[ 20 , 30 , [ 0 , 1 , 2 , 30 , 34 ]]
>> > multi_dim_list = [[ 1,0 , 0,1 , 2,0 ], [ 0,2 , 1,0 , 0,3 ], [ 1,0 , 0,3 , 1,0 ]]
список мутаций
test_list = [[], []]
def mutate_incoming ( test_list , params ):
a, b = params
list_a, list_b = test_list
list_a.append (а)
list_b.append (б)
a_list = [ 20 , 30 , 40 ]
b_list = [ ' huh ' , ' yes ' , ' ack ' ]
для параметров в zip (a_list, b_list):
mutate_incoming (test_list, params)
list_a, list_b = test_list
print (list_a, list_b)
>> [ 20 , 30 , 40 ] [ « да » , « да » , « ack » ]
В приведенном выше фрагменте мы рассматриваем
test_listаналогичную ссылку, каждый раз, когда mutate_incomingвызывается, она добавляет новые данные во вложенный список ( [[],[]]), который test_listпредставляет символ . Это позволяет создавать сжатые архивы, абстрагируя операцию .append, которая в противном случае была бы необходима.для цикла.
для элемента в list_of_items:
печать (элемент)
продвинутые потребности .. (из твиттера Хеттингера)
min (random () для i в диапазоне ( 10_000 )) # 1,03 мсек на цикл
min (random () для _ в повторении ( нет , 10_000 )) # 841 usec на цикл
Классы
базовые классы
более конкретные / расширенные динамические экземпляры классов
Следующий пример вряд ли будет полезен для большинства случаев использования. Существуют сценарии, когда вы не хотите (или не можете) написать метод класса для каждой возможной функции вашего класса. Динамическое добавление методов (и эй, они обрабатываются) может помочь вам упростить использование и обслуживание кода ваших классов, если вы знаете, что делаете.
Класс DemoClass :
def __init__ ( self ):
self .power = 2
def __getattr__ ( self , name ):
Метод def ( * args , ** kw ):
если имя в [ ' work ' , ' стерео ' ]:
если isinstance (kw, dict ) и kw:
print ( ' a dict ' , kw)
elif isinstance (args, tuple ) и args:
print ( ' кортеж ', аргументы)
метод возврата
f = DemoClass ()
f.work ( урон = 20 , обратный = - 1 )
работа ( 20 , 1 )
"" "
dict {'урон': 20, 'реверс': -1}
кортеж (20, 1)
" ""
Больше!? ОК :) что если я хочу иметь атрибуты и функции с одинаковыми именами, но иметь уникальное поведение
c = NewClass ()
c.bar # <- attr
c.bar ( 20 ) # <- метод!
работа Python не позволяет нам делиться именами атрибутов и методов. например, следующее не разрешено:
some_class_instance.some_name # <- attr
some_class_instance.some_name () # <- метод
Делаем класс повторяемым
иногда вам нужно создать оболочку для какого-либо типа данных, это позволит вам превратить экземпляр класса в нечто, что вы можете перебирать.
Класс Эмо :
def __init__ ( self , data ):
self .twoo = []
self .twoo.extend (data)
def __iter__ ( self ):
вернуть iter ( self .twoo)
ак = эмо ([ 20 , 30 , 40 ])
для г в ак:
печать (г)
Стандартная библиотека
Это массивная тема. но сейчас..
pathlib
Итерация по путям .. легкий путь
нравится
из pathlib путь импорта
dataset_root = Путь ( г ' C: \ U SERS \ г энергосбе \ D esktop \ G ITHUB \ с verchok \ П од ' )
analyzer_path = dataset_root / ' analyzer '
для node_path в analyzer_path.iterdir ():
print (node_path)
Datetime
Я люблю этот модуль. Этот пример находит все понедельники в заданном диапазоне дат
с даты и времени импорта дата и время, дата, время
def find_mondays_between ( начало , конец , date_format = " % m / % d /% Y " ):
a = datetime.strptime (start, date_format)
b = datetime.strptime (end, date_format)
дельта = б - а
num_days = delta.days
понедельники = []
для i в диапазоне (delta.days + 1 ):
day = a + timedelta ( days = i),
если day.weekday () == 0 :
day_str = day.strftime (date_format)
mondays.append (day_str)
возвращение понедельники
print (find_mondays_between ( " 01.01.2008 " , " 12.03.2008 " ))
Попробуйте кроме
что такое Try / Except? хороший ресурс для более глубокого размышления здесь: лично я склонен использовать некоторую форму следующего. Он отображает номер строки и ошибку. Если этого недостаточно, возможно, это более сложно, и в любом случае ошибка не будет передана. Вот когда вы снова включаете свой мозг и рассуждаете о линии, которая вызывает ошибку.
импорт SYS
try :
...
кроме исключений как err:
print ( ' ----- ' , err, end = ' | ' )
print ( ' Ошибка в строке {} ' .format (sys.exc_info () [ - 1 ]. tb_lineno))
Комментарии
Отправить комментарий