Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 1, 2022 16:56:11

Kvit
Зарегистрирован: 2022-09-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

Добрый день!
Знакомлюсь немного с питоном, делаю задачки на code-basics и одно из решений меня немного смутило (см. пикчу ниже)



Смутило выражение ‘*’ * stars_count в учительском решении. Разве оно не противоречит строгой типизации? При перемножении строки на число, разве, не должно выдавать ошибку? Или это только сложения/вычитания касается? Или это только в f-строках работает?

Отредактировано Kvit (Сен. 1, 2022 16:57:37)

Офлайн

#2 Сен. 1, 2022 18:02:05

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2751
Репутация: +  184  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

> Разве оно не противоречит строгой типизации?

Не надо думать что у python-а строгая типизация. По большому счёту никакой явной проверки типов нет. Типы являются совместимыми если совместимы их интерфейсы. Так у строки кто то определил метод __mul__ (как раз его и вызывает умножение) который при вызове

 >>> "*".__mul__(5)
вернёт
 >>> '*****'



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Сен. 1, 2022 22:00:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

Лучше так пиши

  
>>> 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)

Офлайн

#4 Сен. 2, 2022 00:04:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

Rodegast
Не надо думать что у python-а строгая типизация. По большому счёту никакой явной проверки типов нет. Типы являются совместимыми если совместимы их интерфейсы.
Надо тебе английский выучить и уже начинать читать книжки на английском, потому что там все секреты написаны.



Офлайн

#5 Сен. 2, 2022 10:10:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

Kvit
При перемножении строки на число… Разве оно не противоречит строгой типизации?

Это же не алгебраическое умножение. Умножение это синтаксический сахар над вызовом метода. По сути три следующих примера эквивалентны

 "*" * count

 "*".multiply(count)

 multiply("*", count)

функция multiply может быть перегружена какое угодно количество раз для каких угодно типов аргументов. То же самое работает и в С++ и в Java



Офлайн

#6 Сен. 2, 2022 11:27:23

Kvit
Зарегистрирован: 2022-09-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

Всем спасибо за ответы!

Офлайн

#7 Сен. 2, 2022 11:52:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

FishHook
функция multiply может быть перегружена какое угодно количество раз
В питоне нет перегрузки функций. В питоне есть только переопределение функций. Перегрузка функции - это когда на одно имя прикрепляется несколько функций одновременно, и выбор функции, прикреплённой к этому имени, зависит от сигнатуры вызова функции по этому имени. Оно из-за того и называется перегрузкой, что на одном имени висит сразу несколько функций.

FishHook
То же самое работает и в С++ и в Java
Да, в C++ и в Java есть, а в питоне нет. Поэтому ты в питоне и не видишь множества разноплановых __init__()'ов, например, у какого-нибудь класса. А в Java это используется сплошь и рядом, потому что это обычная перегрузка конструктора.



Отредактировано py.user.next (Сен. 2, 2022 11:54:39)

Офлайн

#8 Сен. 2, 2022 12:12:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

py.user.next
В питоне нет перегрузки функций.
Ну и что, что в питоне нет, в питоне это решается по-другому - проверкой типа в рантайме, это абсолютно не важно в рамках данного разговора.



Офлайн

#9 Сен. 2, 2022 12:22:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

FishHook
в питоне это решается по-другому - проверкой типа в рантайме
Это всё, конечно, интересно, но это то же самое, что говорить, что любой язык является ООП-языком, так как на любом языке можно ООП сделать. Просто убери арифметические операции в питоне и начни пользоваться этой “перегрузкой” в питоне, которая якобы реализуема через if-then-else. Твой код очень быстро превратится в непонятно что с кучей if'ов каких-то по всему коду. А всё почему? А потому, что перегрузки нет там.



Офлайн

#10 Сен. 2, 2022 14:05:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Почему нет нарушения строгой типизации?

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"))

у нас только что не было перегрузки и вот она уже есть. Предлагаю перестать испражняться не по делу в чужом топике. Топикстартер свои ответы получил, а я лично у тебя ничего не спрашивал.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version