Найти - Пользователи
Полная версия: Как "втолковать" функции, что данные - это лист?
Начало » Python для новичков » Как "втолковать" функции, что данные - это лист?
1
АндрейК
Подскажите, пожалуйста, ответ на вопрос (судя по всему простой), но который я не могу решить долгое время.
Пишу функцию, данные для которой должны являться листом. Вернуть должна количество элементов в листе.
>>> def andrey (symbols):
print (len(symbols))
>>> andrey('aaa')
3
вернул длину первого элемента, а не количество элементов
>>> andrey('aaa','aaaaa')
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
andrey('aaa','aaaaa')
TypeError: andrey() takes exactly 1 positional argument (2 given)
здесь вообще отказывается понимать

Т.е. хотелось бы получить результат в первом случае 1, во втором 2.
Причем если писать непосредственно так:
>>> andrey=('aaa','aaaaa')
>>> len(andrey)
2
>>>
то все работает, правда для двух и более элементов, а для одного продолжает возвращать его длину, а не количество.
>>> andrey=('aaa')
>>> len(andrey)
3
o7412369815963
>>> def foo(x):
... print len(x)
...
>>> foo([1])
1
>>> foo(['123'])
1
>>> foo(['123','456'])
2
>>> foo( ('123',) )
1
>>> def foo(*x):
... print len(x)
...
>>> foo('123')
1
>>> foo('123','456')
2
('aaa') = ‘aaa’ # не массив, а строка. нужно так писать ('aaa',)
Spectral
АндрейК
Подскажите, пожалуйста, ответ на вопрос (судя по всему простой), но который я не могу решить долгое время.
Пишу функцию, данные для которой должны являться листом. Вернуть должна количество элементов в листе.

>>> def andrey (symbols):
print (len(symbols))
>>> andrey('aaa')
3

вернул длину первого элемента, а не количество элементов
Нет, не так. Вы подали в качестве аргумента строку, состояющую из трех элементов ‘a’,'a','a'
Так что Питон здесь прав, так как функция len() определяет длину строки или кол-во элементов в списке(умеет и то, и то т.е.)
Сравните результаты работы функции для разных входных условий.
s=
s1='12345'
s2=

def andrey (symbols):
print (len(symbols))

andrey(s)
andrey(s1)
andrey(s2)

>>> andrey('aaa','aaaaa')
Traceback (most recent call last):
File “<pyshell#5>”, line 1, in <module>
andrey('aaa','aaaaa')
TypeError: andrey() takes exactly 1 positional argument (2 given)

здесь вообще отказывается понимать
там же написано: функция получила два аргумента вместо одного.
А в определении функции фигурирует только один входной параметр.
s= решает вашу проблему

Т.е. хотелось бы получить результат в первом случае 1, во втором 2.
Причем если писать непосредственно так:

>>> andrey=('aaa','aaaaa')
>>> len(andrey)
2
>>>

то все работает, правда для двух и более элементов, а для одного продолжает возвращать его длину, а не количество.
>>> andrey=('aaa')
>>> len(andrey)
3
>>>
этот тип данных называется tuple, это не список. Они отличаются друг от друга тем, что таплы не изменяются.
т.е. если напишите так:
>>> print s
(1, 2)
>>> s=2

то вывалится ошибка:
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: ‘tuple’ object does not support item assignment

питон не делает разницы между переменной, содержащей символы и таплом (русское название - кортеж данных), содержащим один строковый элемент.
смотрите сами:
>>> s1=('adad')
>>> s2='adad'
>>> s1==s2
True
bw
> питон не делает разницы между переменной, содержащей символы и таплом
Бред какой.
>>> s1=('adad')
>>> type(s1)
<type 'str'>
>>> t1 = ('adad',)
>>> type(t1)
<type 'tuple'>
>>> 'foo' == ('foo',)
False
Это также правильная запись кортежа: 'foo', (т.е. скобки можно опускать, но если необходимо создать кортеж из одного элемента, это странную запятую поставить необходимо, если элементов несколько, то запятую ставить не принято, хотя допустимо).
Дальше читаем документацию про аргументы в функциях и про записи вида:
1. def foo(*args):
2. def bar(**kwargs):
3. def baz(a1, a2, k1 = ‘v1’, k2 = ‘v2’, *args, **kwargs): print args, kwargs
>>> foo(1, 2, 3, 4, 5, k3 = 6)
(5,) {'k3': 6}

..bw
guranvir
Не ну разницу он конечно делает между кортежем и строкой. Просто и тот и тот объект неизменяемый. А то что вы написали s1==s2, это он просто сравнил размерности объектов(True) взял элемент кортежа и сравнил со строкой(true) и сказал да объекты одинаковы. Но как только в кортеже окажется элементов больше 1 вы увидите следующее:
>>> s=('aaa','aaa')
>>> s1='aaa'
>>> s==s1
False
Spectral
Спасибо, guranvir, теперь буду знать.
АндрейК
Спасибо, даже не ожидал, что мне так подробно ответят и все разъяснят. Спасибо, ребята!
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