====== Python ======
===== Перенос установленных пакетов pypi в закрытый контур =====
# Экспорт установленных пакетов на машине, имеющей доступ в интернет
$folder = 'C:\temp\twine'
mkdir $folder -ErrorAction SilentlyContinue > $null
(pip.exe list |select -Skip 2) -replace '\s+','==' |% {
pip.exe download -d $folder $_
}
Compress-Archive $folder\* -DestinationPath "$folder.zip"
# Импорт на машине, где нет доступа к интернету, распаковав архив (здесь: C:\temp\twine).
# Запускать раз за разом, пока не исчезнут ошибки.
$pip = "$env:localappdata\Programs\Python\Python312\Scripts\pip.exe"
(dir "C:\temp\twine" |? name -notmatch '^pip').fullname |% {
& $pip install --no-warn-script-location $_
}
====== code-basics.com ======
https://code-basics.com/ru/languages/python
===== Функции =====
Параметры функций
def truncate(text, length):
t = text[:length] + '...'
return t
print(truncate('Нашли ошибку? Есть что добавить?', 16))
Необязательные параметры функций. Обязательные параметры должны идти первыми.
def get_hidden_card(num, star=4):
return '*' * star + num[-4:]
print(get_hidden_card('1425364758697069'))
Именованные аргументы.\\
Преимущество перед позиционными в том, что он более наглядны и можно указывать только те параметры, которые нужны, а не все необязательные.\\
Позиционные должны идти первыми.
def trim_and_repeat(string, offset=0, repetitions=1):
return string[offset:] * repetitions
print(trim_and_repeat('Hello!', offset=3, repetitions=5)) #lo!lo!lo!lo!lo!
Аннотации типов. Указание типов, какие нужно ожидать и какой будет на выходе, повышает удобство и читаемость.
def word_multiply(string: str, repetitions: int) -> str:
return string * repetitions
print(word_multiply('Hello!',2)) #Hello!Hello!
===== Логика =====
Логический тип (true/false). ''=='' - равно, ''!='' - не равно.
def is_pensioner (age: int):
return age >= 60
print(is_pensioner(79)) # True
Предикаты. Возврат True/False, функции принято обозначать, начиная с is_/has_
def is_mister(mister: str):
return mister == 'Mister'
print(is_mister('Mister')) # чувствительно к регистру
Комбинирование операций и функций.\\
Приоритет арифметических операций выше логических.
def is_international_phone(number: str):
return number[0] == '+'
print(is_international_phone('89651234567')) # False
And/Or.
#Решение учителя:
def is_leap_year(year):
return year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)
#Ваше решение:
def is_leap_year(year: int):
return year % 4 == 0 and (year % 400 == 0 or year % 100 != 0)
print(is_leap_year(2000)) # True
print(is_leap_year(1900)) # False
Not. Возможно множественное отрицание: ''not not''.
def is_palindrome(string: str):
str = string.lower().replace(' ','')
return str == str[::-1]
# Через регулярку
#def is_palindrome(string: str):
# import re
# str = re.sub('\s+', '', string.lower())
# return str == str[::-1]
def is_not_palindrome(string: str):
return not is_palindrome(string)
print(is_palindrome('Оголи жопу пожилого')) # True
print(is_palindrome('Привет родителям')) # False
print(is_not_palindrome('Оголи жопу пожилого')) # False
print(is_not_palindrome('Привет родителям')) # True
Результат логических выражений.\\
Проверка идёт слева направо: OR возвращает первое true, AND - первое false.\\
''None'', ''0'', ''0.0'' - False, остальное - True.
# true and yes = true, true or no = true
print(10 % 2 == 0 and 'yes' or 'no') # => 'yes'
# false and yes = false, false or no = false
print(11 % 2 == 0 and 'yes' or 'no') # => 'no'
print(1 and 2 and 3 and 4 or 5) # 4
print(1 or 2 or 3 or 4 and 5) # 1
def string_or_not(string):
return isinstance(string, str) and 'yes' or 'no'
print(string_or_not('Hexlet')) # 'yes'
print(string_or_not(10)) # 'no'
print(string_or_not('')) # 'yes'
print(string_or_not(False)) # 'no'
===== Условия =====
IF
def guess_number(num: int):
if num == 42:
return 'You win!'
return 'Try again!'
# Вариант с and/or
#def guess_number(num: int):
# return num == 42 and 'You win!' or 'Try again!'
print(guess_number(42)) # You win!
ELSE\\
Сделать все URL начинающимися с ''%%https://%%''.
def normalize_url(url):
if url[:8] == 'https://':
return url
else:
if url[:7] == 'http://':
return 'https://' + url[7:]
else:
return 'https://' + url
print(normalize_url('https://ya.ru')) # https://ya.ru
print(normalize_url('google.com')) # https://google.com
print(normalize_url('http://ai.fi')) # https://ai.fi
ELIF - альтернативное условие.
def who_is_this_house_to_starks(i):
if i == 'Karstark' or i == 'Tully':
return 'friend'
elif i == 'Lannister' or i == 'Frey':
return 'enemy'
else:
return 'neutral'
print(who_is_this_house_to_starks('Karstark')) # => 'friend'
print(who_is_this_house_to_starks('Frey')) # => 'enemy'
print(who_is_this_house_to_starks('Joar')) # => 'neutral'
print(who_is_this_house_to_starks('Ivanov')) # => 'neutral'
# Можно обойтись без else (в этом случае):
elif i == 'Lannister' or i == 'Frey':
return 'enemy'
return 'neutral'
Тернарный оператор\\
if — это инструкция, а не выражение. В Python есть конструкция, которая работает как if-else, но считается выражением.\\
В целом, тернарный оператор - это более лаконичный вариант if-else.
# Вариант IF
def flip_flop(i: str):
if i == 'flip':
return 'flop'
return 'flip'
# Тернарный оператор
def flip_flop(i: str):
return 'flop' if i == 'flip' else 'flip'
print(flip_flop('flip')) # flop
print(flip_flop('floppy')) # flip
Match (аналог switch в Powershell)\\
Частный случай if-else, в ряде случаев читается лучше.
def get_number_explanation(i: int):
match i:
case 666:
return 'devil number'
case 42:
return 'answer for everything'
case 7:
return 'prime number'
case _:
return 'just a number'
print(get_number_explanation(8)) # just a number
print(get_number_explanation(666)) # devil number
print(get_number_explanation(42)) # answer for everything
print(get_number_explanation(7)) # prime number
# Без case_, как и без else, здесь можно обойтись:
match i:
case 7:
return 'prime number'
return 'just a number'
===== Циклы =====
WHILE
def print_numbers(last_number):
i = last_number
while i >= 1:
print(i)
i = i - 1
print('finished!')
print_numbers(4) # 4,3,2,1,finished!
Агрегирование данных - добавление к уже имеющимся.
# Перемножение чисел в диапазоне
def multiply_numbers_from_range(start, end):
result = 1
while start <= end:
result = result * start
start = start + 1
return result
print(multiply_numbers_from_range(1, 15)) # 1307674368000
# Агрегирование строк
def join_numbers_from_range(start, end):
string = ''
while start <= end:
string = string + str(start)
start = start + 1
return string
print(join_numbers_from_range(4, 11)) # 4567891011
Обход строк
def print_reversed_word_by_symbol(word):
i = len(word) - 1
while i >= 0:
print(word[i])
i = i - 1
print_reversed_word_by_symbol('word')
d
r
o
w
Условия внутри тела цикла
def count_chars(string, char):
string = string.lower()
char = char.lower()
index = 0
count = 0
while index < len(string):
if string[index] == char:
# Считаем только подходящие символы
count = count + 1
# Счетчик увеличивается в любом случае
index = index + 1
return count
# или делать каждую итерацию:
if string[index].lower() == char.lower():
Подстрока (substring) с помощью цикла
def my_substr(string, num):
index = 0
result = ''
while index < num:
result = result + string[index]
index = index + 1
return result
print(my_substr('Привет, как поживаешь?', 9))
Привет, к
# Проверка правильности аргументов
# Функция возвращает False, если хотя бы одно из условий истинно:
# Отрицательная длина извлекаемой подстроки.
# Отрицательный заданный индекс.
# Заданный индекс выходит за границу всей строки.
# Длина подстроки в сумме с заданным индексом выходит за границу всей строки.
# В ином случае функция возвращает True.
def is_arguments_for_substr_correct(string, index, subst):
if subst < 0 or index < 0 or index >= len(string) or (subst + index) > len(string):
return False
return True
string = 'Sansa Stark'
end = len(string) - 1
print(is_arguments_for_substr_correct(string, 2, -3)) # False
print(is_arguments_for_substr_correct(string, -1, 3)) # False
print(is_arguments_for_substr_correct(string, 0, 5)) # True
print(is_arguments_for_substr_correct(string, end + 1, 0)) # False
==== Синтаксический сахар ====
Вместо ''index = index + 1'' пишется ''index += 1''.
^Исходная форма ^Сокращённая форма ^
|''a = a + 1'' |''a += 1'' |
|''a = a - 1'' |''a -= 1'' |
|''a = a * 2'' |''a *= 2'' |
|''a = a / 1'' |''a /= 1'' |
# Удаление символа из строки без replace()
def filter_string(text, letter):
length = len(text)
index = 0
word = ''
while index < length:
if text[index] != letter:
word += text[index]
index += 1
return word
print(filter_string("Привет, как поживаешь?", 'а'))
Привет, кк поживешь?
==== Возврат из цикла ====
# Решение по теме
def is_contains_char(string, char):
index = 0
while index < len(string):
if string[index] == char:
return True
index += 1
return False
# Моё решение (не вчитался в условие, сделал по-другому)
def is_contains_char(str, char):
if (char in str):
return True
return False
==== Цикл For ====
Как foreach в powershell. Для while нужно задавать условие остановки и вводить счетчик.\\
Цикл For предназначен для коллекций, где понятно, где останавливаться, в результате он лаконичнее while.
# Функция filter_string(), реализованная ранее с помощью while
def filter_string(str, char):
res = ''
for c in str:
if (c.lower() != char.lower()):
res += c
return res
# range() - диапазон
#range(stop) создает последовательность от 0 до stop - 1
#range(start, stop) создает последовательность от start до stop - 1
#range(start, stop, step) создает последовательность из чисел от start до stop - 1, с шагом step
for i in range(3, 0, -1):
print(i)
3
2
1
def print_table_of_squares(start, end):
for i in range(start, end+1):
print(f'square of {i} is {i ** 2}')
print(print_table_of_squares(1, 4))
square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
None
====== Тони Гэддис - Начинаем программировать на Python, 5 изд. ======
===== Ввод, обработка, вывод =====
>>> name = 'world'
>>> print('name') # в кавычках - буквальное значение
name
>>> print(name) # без кавычек - чтение переменной
world
print('One', 'two') # Разделитель - пробел
One two
>>> print('One', 'two', sep='---') # Задать разделитель
One---two
>>> print('One', end='-') # Задать символ окончания строки (по умолчанию - перенос строки)
>>> print('two', end='!')
One-two!
name = input('Enter your name: ') # Ввод пользователя
hours = int(input('How many hours you\'ve worked: ')) # Вложенная функция - строку (при вводе всегда строка) в целое число. \ - экранирование
# f-строки - форматирование вывода
>>> print(f'Hello, {name}!') # {name} - местозаполнитель
Hello, world!
>>> num = 10
>>> print(f'Значение равно {num + 2}.') # В местозаполнителе можно использовать выражения
Значение равно 12.
# {местозаполнитель:спецификатор формата}
стр 80
===== Проблемы и их решение =====
==== pip: Fatal error in launcher: Unable to create process ====
После установки новой версии питона и удаления старой. Помогло удаление каталогов старых версий в ''%LocalAppData%\Programs\Python''
https://stackoverflow.com/questions/37220055/pip-fatal-error-in-launcher-unable-to-create-process-using