Форум сайта python.su
0
Добрый день!
Знакомлюсь немного с питоном, делаю задачки на code-basics и одно из решений меня немного смутило (см. пикчу ниже)
Смутило выражение ‘*’ * stars_count в учительском решении. Разве оно не противоречит строгой типизации? При перемножении строки на число, разве, не должно выдавать ошибку? Или это только сложения/вычитания касается? Или это только в f-строках работает?
Отредактировано Kvit (Сен. 1, 2022 16:57:37)
Офлайн
186
> Разве оно не противоречит строгой типизации?
Не надо думать что у python-а строгая типизация. По большому счёту никакой явной проверки типов нет. Типы являются совместимыми если совместимы их интерфейсы. Так у строки кто то определил метод __mul__ (как раз его и вызывает умножение) который при вызове
>>> "*".__mul__(5)
>>> '*****'
Офлайн
857
Лучше так пиши
>>> def get_hidden_card(card_number, stars_count=4): ... visible_digits_line = card_number[-4:] ... return '*' * stars_count + visible_digits_line ... >>> get_hidden_card('1234123412341234') '****1234' >>>
KvitУ питона строгая и динамическая типизация. Просто для этих конкретных типов предусмотрены такие конкретные операции некоторые. Например, строку можно умножить на число, но нельзя умножить на строку. Также строку нельзя поделить вообще на что-то.
При перемножении строки на число, разве, не должно выдавать ошибку? Или это только сложения/вычитания касается? Или это только в f-строках работает?
>>> 'a' * 3 'aaa' >>> 'a' * 'b' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't multiply sequence by non-int of type 'str' >>> 'a' / 3 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for /: 'str' and 'int' >>>
>>> import time >>> >>> if time.time() % 10 > 5: ... a = 1 ... else: ... a = 'text' ... >>> a 1 >>> >>> import time >>> >>> if time.time() % 10 > 5: ... a = 1 ... else: ... a = 'text' ... >>> a 'text' >>>
Отредактировано py.user.next (Сен. 1, 2022 22:25:28)
Офлайн
857
RodegastНадо тебе английский выучить и уже начинать читать книжки на английском, потому что там все секреты написаны.
Не надо думать что у python-а строгая типизация. По большому счёту никакой явной проверки типов нет. Типы являются совместимыми если совместимы их интерфейсы.
Офлайн
568
Kvit
При перемножении строки на число… Разве оно не противоречит строгой типизации?
"*" * count
"*".multiply(count)
multiply("*", count)
Офлайн
0
Всем спасибо за ответы!
Офлайн
857
FishHookВ питоне нет перегрузки функций. В питоне есть только переопределение функций. Перегрузка функции - это когда на одно имя прикрепляется несколько функций одновременно, и выбор функции, прикреплённой к этому имени, зависит от сигнатуры вызова функции по этому имени. Оно из-за того и называется перегрузкой, что на одном имени висит сразу несколько функций.
функция multiply может быть перегружена какое угодно количество раз
FishHookДа, в C++ и в Java есть, а в питоне нет. Поэтому ты в питоне и не видишь множества разноплановых __init__()'ов, например, у какого-нибудь класса. А в Java это используется сплошь и рядом, потому что это обычная перегрузка конструктора.
То же самое работает и в С++ и в Java
Отредактировано py.user.next (Сен. 2, 2022 11:54:39)
Офлайн
568
py.user.nextНу и что, что в питоне нет, в питоне это решается по-другому - проверкой типа в рантайме, это абсолютно не важно в рамках данного разговора.
В питоне нет перегрузки функций.
Офлайн
857
FishHookЭто всё, конечно, интересно, но это то же самое, что говорить, что любой язык является ООП-языком, так как на любом языке можно ООП сделать. Просто убери арифметические операции в питоне и начни пользоваться этой “перегрузкой” в питоне, которая якобы реализуема через if-then-else. Твой код очень быстро превратится в непонятно что с кучей if'ов каких-то по всему коду. А всё почему? А потому, что перегрузки нет там.
в питоне это решается по-другому - проверкой типа в рантайме
Офлайн
568
py.user.next
Если тебя родители в детстве не уберегли от наркомании, то можешь раскидывать ифы по коду и делать другие глупости. Питон здорового человека выглядит вот так
from functools import singledispatch @singledispatch def foo(a: int, b: int) -> str: return f"a x b - pair of int" @foo.register def _(dct: dict) -> str: return f"{dct['a']} x {dct['b']} - dict" @foo.register def _(raw: str) -> str: a, b = (int(i) for i in raw.split(",")) return f"{foo(a, b)}, from raw input" print(foo(1, 2)) print(foo({"a": 1, "b": 2})) print(foo("1, 2"))
Офлайн