Чи ви впевнені, що знаєте Python?
В статті зібрані деякі найменш знані штучки і плюшки 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 це просто! 
З'єднання кількох словників в один
Якщо вам необхідно з'єднати кілька словників в один - використовуйте метод 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


Коментарі:
1
xandr
Самый эффективный способ "разровнять" список
list - это список с вложенными списками.
Детали и описание по ссылке источника link
1
mihailruslanov
Там є помилки:
1. listB = listB - відредагуйте
2. Endwith в заголовку хоча в коді вона Endswith.
А так, мені сподобалось.
0
Q-Bart
@mihailruslanov, дякую. Вже виправляю
1
aqrln
Цікавий спосіб викликати функцію
По-перше, треба так:
бо створювати новий ітерабельний об'єкт, щоб за допомогою отриманих з нього значень індексувати елементи послідовності, що за визначенням є ітерабельним об'єктом – це сильно. Особливо весело, що, судячи з
print, це Python 2. Тоді в даному уривку коду створюється новий список, щоб за допомогою нього ітерувати інший список.Копіюваня двох списків
Або так:
В Python 3.5 варіант з конструктором працює найшвидше. Всі інші, окрім
list.copy(self)іlist.__getitem__(self, slice), приблизно так само.Список списків
Через спискове включення гарніше ж:
Ну а взагалі, оскільки стаття явно призначена для початківців, то, я думаю, про functions as first-class citizens і shallow-copy bug краще було б розписати детальніше. Всі, в кого досвід в пайтоні більший за пару тижнів, тільки посміхнуться від цієї статті, бо тут зібрані самі ази мови, а от для повних новачків деякі моменти будуть неочевидними.
0
Buryachek Dima
list1=[1,2,3]
list2=['a','b','c']
d=dict(zip(list1,list2))