В статті зібрані деякі найменш знані штучки і плюшки 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 - напишіть, будь ласка, в коментарях.
Ще немає коментарів