Форум сайта python.su
Добрый день!
Знакомлюсь немного с питоном, делаю задачки на code-basics и одно из решений меня немного смутило (см. пикчу ниже)
Смутило выражение ‘*’ * stars_count в учительском решении. Разве оно не противоречит строгой типизации? При перемножении строки на число, разве, не должно выдавать ошибку? Или это только сложения/вычитания касается? Или это только в f-строках работает?
Отредактировано Kvit (Сен. 1, 2022 16:57:37)
Офлайн
> Разве оно не противоречит строгой типизации?
Не надо думать что у python-а строгая типизация. По большому счёту никакой явной проверки типов нет. Типы являются совместимыми если совместимы их интерфейсы. Так у строки кто то определил метод __mul__ (как раз его и вызывает умножение) который при вызове
>>> "*".__mul__(5)
>>> '*****'
Офлайн
Лучше так пиши
>>> 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)
Офлайн
RodegastНадо тебе английский выучить и уже начинать читать книжки на английском, потому что там все секреты написаны.
Не надо думать что у python-а строгая типизация. По большому счёту никакой явной проверки типов нет. Типы являются совместимыми если совместимы их интерфейсы.
Офлайн
Kvit
При перемножении строки на число… Разве оно не противоречит строгой типизации?
"*" * count
"*".multiply(count)
multiply("*", count)
Офлайн
Всем спасибо за ответы!
Офлайн
FishHookВ питоне нет перегрузки функций. В питоне есть только переопределение функций. Перегрузка функции - это когда на одно имя прикрепляется несколько функций одновременно, и выбор функции, прикреплённой к этому имени, зависит от сигнатуры вызова функции по этому имени. Оно из-за того и называется перегрузкой, что на одном имени висит сразу несколько функций.
функция multiply может быть перегружена какое угодно количество раз
FishHookДа, в C++ и в Java есть, а в питоне нет. Поэтому ты в питоне и не видишь множества разноплановых __init__()'ов, например, у какого-нибудь класса. А в Java это используется сплошь и рядом, потому что это обычная перегрузка конструктора.
То же самое работает и в С++ и в Java
Отредактировано py.user.next (Сен. 2, 2022 11:54:39)
Офлайн
py.user.nextНу и что, что в питоне нет, в питоне это решается по-другому - проверкой типа в рантайме, это абсолютно не важно в рамках данного разговора.
В питоне нет перегрузки функций.
Офлайн
FishHookЭто всё, конечно, интересно, но это то же самое, что говорить, что любой язык является ООП-языком, так как на любом языке можно ООП сделать. Просто убери арифметические операции в питоне и начни пользоваться этой “перегрузкой” в питоне, которая якобы реализуема через if-then-else. Твой код очень быстро превратится в непонятно что с кучей if'ов каких-то по всему коду. А всё почему? А потому, что перегрузки нет там.
в питоне это решается по-другому - проверкой типа в рантайме
Офлайн
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"))
Офлайн