Типы в Python

Материал из Xgu.ru

Перейти к: навигация, поиск

Содержание

[править] Вопросы и ответы

[править] Как сгенерировать случайную строку?

''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))

[1]


[править] Длина строки eval в Питоне ограничена?

Да.

Точная длина строки неизвестна, но факт остаётся фактом. Кроме того, это один из немногих известных багов, где Питон гарантировано вылетает с Segmentation fault[1].


[править] Как рекурсивно обработать какую-то сложную структуру данных?

Как рекурсивно обработать сложную структуру данных и перевести её например всю в Unicode или наоборот из Unicode в строку?

def convert(data):
    if isinstance(data, basestring):
        return str(data)
    elif isinstance(data, collections.Mapping):
        return dict(map(convert, data.iteritems()))
    elif isinstance(data, collections.Iterable):
        return type(data)(map(convert, data))
    else:
        return data

Источник: Fastest way to convert a dict's keys & values from `unicode` to `str`? Stackoverflow.png


[править] Какая скорость доступа к элементу словаря в Python?

В принципе, считается что обычно O(1), но в худших случаях может быть и O(n).

Подробнее: [2].


[править] Можно ли в Python сделать статическую типизацию?

Можно, но жалко.

Если серьёзно, то можно. Есть очень интересный проект MyPy, который именно этим и занимается.

[править] Много ли в Python магических методов?

Даже один магический метод это уже много. А в питоне их значительно больше.

Полный список можно посмотреть тут:


[править] Как создавать постоянные (persistent) объекты в Python?

  • pickle/cpickle
  • marshal
  • shelve
  • json
  • jsonpickle
  • xml
  • database (like SQLite)

Не такой популярный, но всё равно полезный метод:

Дополнительная информация:


[править] Как организовать случайный выбор слова из взвешенного словаря?

Если в словаре пары

 слово => вес ,

то случайный выбор слова с вероятностью пропорциональной его весу можно сделать так (идея взята отсюда [3], только у них список пар, а у нас словарь):

#!/usr/bin/python

import random

dict = {
    'a'     : 50,
    'b'     : 50,
    'c'     : 100,
}

def wrandom(dict):
    total = sum(dict.values())
    n = random.uniform(0, total)

    for key in sorted(dict.keys()):
        item = key
        if n < dict[key]:
            break
        n -= dict[key]

    return item

for i in range(20000):
    print wrandom(dict)

Проверка:

$ python random-dict.py | sort | uniq -c
   5098 a
   5045 b
   9857 c

[править] Можно ли использовать имена переменных в строковой интерполяции?

var1=10
var2=20
print "var1 = %(var1)s; var2 = %(var2)s" % locals()

[править] Как создать пары из списка?

t = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
zip(t[::2], t[1::2])

[править] Что будет если изменить аргумент функции, когда в нём находится значение по умолчанию?

Если это изменяемый объект (в частности, список, словарь), то он изменится.

>>> def function(data=[]):
...     data.append(1)
...     return data
...
>>> function()
[1]
>>> function()
[1, 1]
>>> function()
[1, 1, 1]

Подробнее: [4].

[править] Примечания

  1. http://stackoverflow.com/questions/11635211/why-is-there-a-length-limit-to-pythons-eval