1. Чем является условие if start: # Что этов приведенном ниже коде?
if variable:
по-умолчанию заменяет примерно такую конструкцию:if (
variable is not None # ни ничего
and variable is not False # ни ложь
and variable != 0 # ни ноль
and variable != '' # ни пустая строка
and variable != [] # ни пустой список
and variable != {} # ни пустой словарь
and variable != tuple() # ни пустой кортеж
and variable != set() # ни пустое множество
):
if variable:
эквивалентны False
. В качестве наглядного примера, if my_list:
для проверки на пустой список []
писать гораздо удобнее, чем if len(my_list) != 0:
.if start:
исключает срабатывание вложенного кода, как при пустой строке ''
, так и при None
.2. Соответственно что передается при вводе пустого Enter?
''
, что затем "присваивается" переменной start
. И так как условием выполнения цикла while
является start != ''
, то в данном коде ввод пустой строки является способом выхода из цикла.3. Чем является пустая строка, ведь она ни False, ни True, ни None
''
имеет тип str
. Однако, см. выше про falsy значения.if start:
покрывает и проверку if start != '':
, и ряд других проверок, описанных в пункте 1. Но почему я не могу написать метод from_string так:cls вместо явного Date позволит наследнику Date (напр. AztecaDate - дата по календарю ацтеков) порождать именно AztecaDate.
Date(1, 1, 2019) # конструктор с сигнатурой (int, int, int)
Date("1.1.2019") # другой конструктор с сигнатурой (str)
В питоне можно добиться подобного, но ручками, анализируя состав аргументов Date.__init__, что неудобно, громоздко и нунафиг. Уж лучше забабахать Date.from_string. Но это неизбежно в динамическом языке - ведь C++ должен знать всё про аргументы конкретных вызовов конструкторов на этапе компиляции, а мы можем в рантайм творить что угодно )))для чего нужен staticmethod, если это уже не метод, а просто функция, и я могу вынести ее из класса.Да, можете. Я думаю, тут действует логика лучшей читаемости и логика экономии пространства имён:
from date import *
вы не получите охапку непонятных имён.# медленно
l = []
for i in range(100500):
l.append(i)
# чуть быстрее )))
push = l.append
for i in range(100500):
push(i)
str(blink[1][1])
blink=(['fire', 'wood'], [1, 3, 777])
nums = [5,6,10]
blink[0].extend(['water', 'stone'])
blink[1].extend(nums)
print(blink)
blink[1][1] = str(blink[1][1]) # присваиваем элементу blink[1][1] строку
print(blink)
abstract class GlobalClass {
...
protected function isExists($value, $field) {
return $this->db->isExists($this->table_name, $field, $value);
}
}
...
class User extends GlobalClass {
...
public function isExists($value, $field=null) {
$field = 'login';
return parent::isExists($value, $field);
}
}
следующей ошибкой будет Maximum function nesting level. Используйте parent.public function isExists($login) { return $this->isExists("login", $login); }
Сессия это хеш который хранится в куках у пользователя, при обращение пользователя к скрипту, пхп сверяет хеш и берет из файла данные этой сессии.
session_regenerate_id();
совсем не нужно.session_start();
$ip = $_SESSION['userIP'];
if (!$ip) {
$_SESSION['userIP'] = $_SERVER['REMOTE_ADDR'];
} elseif ($ip != $_SERVER['REMOTE_ADDR']) {
session_destroy();
session_start();
}