Найти - Пользователи
Полная версия: Python. Переменные. Тип переменных
Начало » Python для новичков » Python. Переменные. Тип переменных
1 2
nntr
Когда я ввожу переменные

a = 2

a = ‘abacaba’

a = foo ()

то после 3 переменной выскакивает сообщение об ошибке

Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
NameError: name ‘foo’ is not defined

А если вводить просто скобку (без foo), то тип будет следующий:

(class ‘tuple’) - кортеж

Хотя, по идее type вообще не должен был всплывать - что указывало бы на динамическую типизацию (отличие Python от других языков).

Shaman
>>> type(())
<class 'tuple'>
>>> type([])
<class 'list'>
>>> type({})
<class 'dict'>
>>> type({1,2})
<class 'set'>
>>> type((0))
<class 'int'>
>>>
Shaman
>>> type((0,))
<class 'tuple'>
>>>
-контрольный
ZerG
 a = foo()
- так в питоне функции вызываются!
Ошибка вам говорит о том что такой функции у вас нигде не описано!
В данном случае

 def foo():
    pass
a = foo()
Было бы правильно!
Но если вы хотите присвоить переменной кортеж или список - достаточно писать
 a = ()
a = []
FishHook
А какой смысл в пустом кортеже?
4kpt_IV
Если я правильно понял вопрос, то пустой кортеж может быть накопительный буфером для других переменных типа кортеж, чтобы не проводить преобразования…

 #
buffer = ()
for i in ((1, 2), (3, 4)):
    buffer += i
print(buffer)
nntr
Вообще, я Python изучаю по данному курсу: https://stepik.org/course/Программирование-на-Python-67

На 7 минуте (в разделе переменные) лектор приводит динамическую типизацию переменных.

Про динамическую типизацию ясно. Однако в данном случае произошла ошибка с примером: пример должен был показать динамический тип переменной а. Что делать?
FishHook
4kpt_IV
А буфер этот нужен в таком экзотическом случае, когда некая функция проверяет тип аргумента и принимает только кортеж? Иначе, если в твоем коде заменить кортеж на список, ничего не теряется. Да и преобразование операция не тяжелая, и выполняется она один раз вместо создания N кортежей.

    
d = tuple([(1, 2) for _ in range(10000)])
def test1():
    buffer = ()
    for i in d:
        buffer += i
   
def test2():
    buffer = []
    for i in d:
        buffer += i
    buffer = tuple(buffer)
   
import timeit
print(timeit.timeit("test1()", setup="from __main__ import test1", number=1))
print(timeit.timeit("test2()", setup="from __main__ import test2", number=1))

 /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/fish/PycharmProjects/test/test.py
0.265347957611
0.000710964202881
FishHook
nntr
Что делать?
Повторюсь в сороковой раз: закрыть ютюб, открыть книжку. Лектора послать к черту.
4kpt_IV
FishHook
А буфер этот нужен в таком экзотическом случае, когда некая функция проверяет тип аргумента и принимает только кортеж?

Я же не говорил, что он нужен всегда. Ну и преобразование это лишняя операция все же. Никакой ценности для выполнения бизнес требования она не несет Просто иногда нужен все же пустой кортеж. Редко, но нужен.

FishHook
Повторюсь в сороковой раз: закрыть ютюб, открыть книжку. Лектора послать к черту.

Поддерживаю.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB