Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Трюки Пайтона

with 4 comments

Це проста мова. Досить вивчити типи даних, і трохи звикнути до табуляцій – і ви вже можете писати що завгодно.

Але іноді цілком випадково зустрічаються такі рядки, що кількадесять їх байтів варті цілих сторінок. Тут я буду збирати таку колекцію. Воно може для когось буде банальним, але коли я вперше з цим стикався, воно в моїй душі щось зачепило, знаєте. 🙂

Отримати список довжини 100, заповнений нулями:

x = [0.0]*100

Перевернути список:

list = list[::-1]

(Зріз має три параметри, розділені двокрапками: звідки (включно), доки (невключно), і з яким кроком)

Важлива ілюстрація суті алгоритму


Зчепити два (чи цілих n) списків в один список пар:

doublelist = zip(list1,list2)

І навпаки:

list1,list2 = zip(*doublelist)

Для цього треба маленьке пояснення. zip() зчеплює n списків в список з n-ок (кортежів з n елементів). “Оператор” * в даному випадку означає те, що список в функцію передається не як один аргумент, а як купа аргументів (поштучно). Проілюструю кодом:

>>> hello = "Hello!" 
>>> def a(*args): 
>>> ... print "\n".join(args) 
>>> a(hello) 
Hello! 
>>> a(*hello) 
H 
e 
l 
l 
o 
!

Енумератор (перелічний тип), чи масив констант:

>>> MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY = range(7)
>>> FRIDAY
4

Конфіг-файл (думав що сам придумав, аж раптом згадав, що я таке в вікіботі бачив):
Називаємо конфіг-файл наприклад settings.py, і пишемо щось типу:

debug = False
username = "bunyk"

Тепер тільки import settings і не треба ніяких парсерів стандартних конфіг-файлів, ні XML, ні JSON (хоча схоже).

Про лексичний аналізатор буде в наступному пості, і трохи детальніше. А цей я буду доповнювати. Якщо натхнення звісно буде…

Акція! Оголошую конкурс на кращий комент. Коментарі, що з кодом будуть відповідати суб’єктивним естетичним критеріям попадуть всередину поста.

Advertisements

Written by bunyk

Листопад 23, 2010 at 01:44

Оприлюднено в Кодерство

Tagged with

Відповідей: 4

Subscribe to comments with RSS.

  1. Не зрозумів приколу zip

    >>> list1, list2 = [“hell on “, “heaven for “], [“earth”, “sky”]
    >>> doublelist = zip(list1,list2)
    >>> [x for (x,y) in doublelist]
    [‘hell on ‘, ‘heaven for ‘]

    і як мені отримати “hell on earth, heaven for sky”?

    а, до-речі, генераторні списки я би поставив на перше місце по значучності.

    import math
    def int2bin(n):
    return “”.join([str((n >> y) & 1) for y in range(round(math.log(n,2)), -1, -1)]).lstrip(‘0’)
    print(int2bin(65535))

    danbst

    Листопад 23, 2010 at 09:00

    • Прикол не в самому zip, а в тому, як синтаксично реалізовується “unzip”.

      і як мені отримати “hell on earth, heaven for sky”?

      >>> print ", ".join([x+y for x,y in doublelist])
      hell on earth, heaven for sky
      

      int2bin – трохи ставить мене в ступор. Зараз спробую розписати на більше рядків…

      bunyk

      Листопад 23, 2010 at 14:41

  2. Вийшло щось таке:

    def int2bin(n):
    ...     numlen = round(math.log(n,2))
    ...     strings = [str((n >> y) & 1) for y in range(numlen,-1,-1)]
    ...     return "".join(strings).lstrip('0')
    ... 
    >>> int2bin(71)
    /usr/bin/bpython:4: DeprecationWarning: integer argument expected, got float
      import sys
    '1000111'
    

    Генераторні списки це переклад “list comprehension”? Я їх не включив, бо дізнався про них ще до того, як вияснив що треба ставити двокрапку в кінці рядка перед вкладеним блоком.

    І є ще крутіші вирази функціонального програмування – генераторні вирази. Це майже так як списки, тільки вони не списки а генератори. Детальніше.

    І взагалі – функціональна частина в Python дуже незвична. Я правда думав краще з нею розібратись коли прочитаю SICP. Не дочитав. Правда з’явилось бажання казати людям що пишуть смайлики дужками поправити БНФ)))))))

    bunyk

    Листопад 23, 2010 at 15:16

  3. […] і найбільш розповсюджений я вже згадував в статті Трюки Пайтона. Він простий і надійний, але з ним правда є проблема […]


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: