Чи ви впевнені, що знаєте Python?

08 грудня 2015 18:41 Q-Bart 1549 5

В статті зібрані деякі найменш знані штучки і плюшки Python, які на перший погляд, здаються нереальними.

Отож, приємного читання!


Як добре очистити список?

Для прикладу, у вас є список, змінну якого ви хочете використати повторно, або видалити всі елементи з нього(очистити). Можна зробити так:

>>> del li

Або так:

>>> del li[:]

Дехто подумає, що варто зробити так:

>>> li = []

Хоча li = [] зробить список порожнім, проте, насправді це створення нового об'єкту списку, а попередній буде далі зберігатись в пам'яті.

А тепер давайте пограємось з інтерпретатором, щоб мати краще уявлення про те що відбувається:

>>> li = [1, 2, 3, 4, 5]
>>> li2 = li
>>> li2
[1, 2, 3, 4, 5]
>>> del li[:]
>>> li
[]
>>> li2
[]
>>> li1 = [1, 3, 5]
>>> li3 = li1
>>> li3
[1, 3, 5]
>>> li1
[1, 3, 5]
>>> li1 = []
>>> li1
[]
>>> li3
[1, 3, 5]
>>> li4 = [1, 2]
>>> li5 = li4
>>> li5
[1, 2]
>>> del li4
>>> li4
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'li4' is not defined
>>> li5
[1, 2]

Ще одне застосування int() функції

Я використовував int() функцію лише для конвертації типу даних string в тип integer. Нариклад: number = int('1050')

Але сьогодні я дізнався, що функція може приймати ще й необов'язковий аргумент. Він конвертує будь-які числа в системі числення від 2 до 32 в десяткову систему числення.

Декілька прикладів:

>>> int('xyz', 36)
44027
>>> int('ff', 16)
255
>>> int('FF', 16)
255
>>> int('f', 16)
15
>>> int('10', 2)
2
>>> int('10')
10
>>> int('10', 10)
10

Python це просто! blush

З'єднання кількох словників в один

Якщо вам необхідно з'єднати кілька словників в один - використовуйте метод update(), який є дуже схожим на функцію extend(), що використовується для контенканації списків.

>>> dict_1 = {1: 'a', 2: 'b', 3: 'c'}
>>> dict_2 = {4: 'd', 5: 'e', 6: 'f'}
>>> dict_1
{1: 'a', 2: 'b', 3: 'c'}
>>> dict_2
{4: 'd', 5: 'e', 6: 'f'}
>>> dict_1.update(dict_2)
>>> dict_2
{4: 'd', 5: 'e', 6: 'f'}
>>> dict_1
{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f'}

Якщо знаєте ще якісь цікаві способи контенканації словників - напишіть в коментарі.

Дзен Python

Якщо ви не розумієте, про що мова, то відкрийте інтерпретатор, та імпортуйте модуль this: import this. Прочитайте вивід. :)

Цікавий спосіб викликати функцію

Запустіть цей код:

def fibonacci(x):   
    if x < 2: return 1
    return (fibonacci(x-2) + fibonacci(x-1))
def factorial(x):
    if x < 2: return 1
    return (x * factorial(x-1))
def main():      
    funcs = [fibonacci, factorial]
    n = 10
    for i in range(len(funcs)):       
        print funcs[i](n)       
main()

Копіюваня двох списків

Новачки, для створення ще одного, такого самого списку, роблять так:

listB = listA

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

listB = []
listB.extend(listA)

Трошки експерименту:

>>> listA = [1, 2, 3, 4, 5]
>>> listB = listA
>>> listC = []
>>> listC.extend(listA)
>>> listB
[1, 2, 3, 4, 5]
>>> listC
[1, 2, 3, 4, 5]
>>> listA
[1, 2, 3, 4, 5]
>>> listB[4] = 0
>>> listB
[1, 2, 3, 4, 0] # Увага
>>> listA
[1, 2, 3, 4, 0] # Увага
>>> listC
[1, 2, 3, 4, 5]
>>> listC[4] = 10
>>> listC
[1, 2, 3, 4, 10] # Увага
>>> listA
[1, 2, 3, 4, 0]
>>> listB
[1, 2, 3, 4, 0]
>>> 

Що повертає функція pow()? integer чи float?

>>> from math import pow
>>> x = pow(5, 2)
>>> x
25.0

А тепер перезапустіть інтерпретатор, і виконайте наступний код:

>>> a = 5
>>> x = pow(a, 2)
>>> x
25
>>> type(x)
<type 'int'>

Чудово, чи не так?

Видалення дублікатів з списку

Для початківців буває складно видалити всі дублікати елементів списку. В Python це можна реалізувати кількома способами. Один з них: створюємо set (детальніше, що таке set ми розглядали в цій статті) списку, а потім список сету :

myList = list(set(myList))

Ось так:

>>> myList = [1, 2, 3, 3, 2, 2, 4, 5, 5]
>>> myList
[1, 2, 3, 3, 2, 2, 4, 5, 5]
>>> myList = list(set(myList))
>>> myList
[1, 2, 3, 4, 5]
>>>

Напишіть, будь ласка, в коментарях, який спосіб використовуєте ви?

Список списків(вкладений список)

Погляньте на цей код:

>>>visited = [[False]*4]*4
>>>visited[0][1] = True
>>>print visited
>>> [[False, True, False, False], [False, True, False, False], [False, True, False, False], [False, True, False, False]]

Бачите проблему? Кожен другий елемент кладених списків змінився на True. Це означає, що команда [[False]*4]*4 створює списки, які містять посилання на один і той же список ('[False, False, False, False]').
Це можна уникнути, наприклад так:

>>> n = 4
>>> m = 4
>>> visited = []
>>> for x in xrange(n):
...      visited.append([False] * m)
... 
>>> visited
[[False, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False]]
>>> visited[0][1] = True
>>> visited
[[False, True, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False]]

Endswith

Функція, що перевіряє чим закінчується певний рядок.

fname = 'movie.avi'
if fname.endswith('avi') or fname.endswith('mp4'):
    print("It's a movie.")

Функція також може приймати аргументом тюпл:

fname = 'movie.avi'
if fname.endswith(('avi', 'mp4')):
    print("It's a movie.")

Так само працює функція startswith.


Більшість прикладів взято з сайту love-python, а також звідси.


Якщо знаєте цікаві штучки в Python - напишіть, будь ласка, в коментарях.

Дякую за увагу!

1549 11

Схожі матеріали:

Коментарі:

xandr

09 Гру 2015 13:05

Самый эффективный способ "разровнять" список

[item for sublist in list for item in sublist]

list - это список с вложенными списками.

Детали и описание по ссылке источника link

mihailruslanov

18 Гру 2015 10:43

Там є помилки:
1. listB = listB - відредагуйте
2. Endwith в заголовку хоча в коді вона Endswith.
А так, мені сподобалось.

Q-Bart

18 Гру 2015 12:13

@mihailruslanov, дякую. Вже виправляю

aqrln

22 Гру 2015 09:19

Цікавий спосіб викликати функцію

funcs = [fibonacci, factorial]
n = 10
for i in range(len(funcs)):
    print funcs[i](n)

По-перше, треба так:

for func in funcs:
    print func(n)

бо створювати новий ітерабельний об'єкт, щоб за допомогою отриманих з нього значень індексувати елементи послідовності, що за визначенням є ітерабельним об'єктом – це сильно. Особливо весело, що, судячи з print, це Python 2. Тоді в даному уривку коду створюється новий список, щоб за допомогою нього ітерувати інший список.

Yo Dawg

Копіюваня двох списків

Або так:

listB = listA.copy()
listB = listA[:]
listB = list(listA)
listB = copy.copy(listA)

В Python 3.5 варіант з конструктором працює найшвидше. Всі інші, окрім list.copy(self) і list.__getitem__(self, slice), приблизно так само.

Список списків

>>> visited = []
>>> for x in xrange(n):
...      visited.append([False] * m)

Через спискове включення гарніше ж:

visited = [[False] * m for _ in xrange(n)]

Ну а взагалі, оскільки стаття явно призначена для початківців, то, я думаю, про functions as first-class citizens і shallow-copy bug краще було б розписати детальніше. Всі, в кого досвід в пайтоні більший за пару тижнів, тільки посміхнуться від цієї статті, бо тут зібрані самі ази мови, а от для повних новачків деякі моменти будуть неочевидними.

Buryachek Dima

10 Бер 2016 22:57

list1=[1,2,3]
list2=['a','b','c']
d=dict(zip(list1,list2))

d

Авторизуйтесь, щоб залишити коментар.