Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 10, 2010 07:22:38

АндрейК
От:
Зарегистрирован: 2010-09-11
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как "втолковать" функции, что данные - это лист?

Подскажите, пожалуйста, ответ на вопрос (судя по всему простой), но который я не могу решить долгое время.
Пишу функцию, данные для которой должны являться листом. Вернуть должна количество элементов в листе.

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



Отредактировано (Окт. 10, 2010 07:23:08)

Офлайн

#2 Окт. 10, 2010 08:37:35

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Как "втолковать" функции, что данные - это лист?

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

Офлайн

#3 Окт. 10, 2010 09:42:33

Spectral
От:
Зарегистрирован: 2010-07-13
Сообщения: 51
Репутация: +  1  -
Профиль   Отправить e-mail  

Как "втолковать" функции, что данные - это лист?

АндрейК
Подскажите, пожалуйста, ответ на вопрос (судя по всему простой), но который я не могу решить долгое время.
Пишу функцию, данные для которой должны являться листом. Вернуть должна количество элементов в листе.

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



Офлайн

#4 Окт. 10, 2010 10:28:32

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как "втолковать" функции, что данные - это лист?

> питон не делает разницы между переменной, содержащей символы и таплом
Бред какой.

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



Офлайн

#5 Окт. 10, 2010 11:27:55

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Как "втолковать" функции, что данные - это лист?

Не ну разницу он конечно делает между кортежем и строкой. Просто и тот и тот объект неизменяемый. А то что вы написали s1==s2, это он просто сравнил размерности объектов(True) взял элемент кортежа и сравнил со строкой(true) и сказал да объекты одинаковы. Но как только в кортеже окажется элементов больше 1 вы увидите следующее:

>>> s=('aaa','aaa')
>>> s1='aaa'
>>> s==s1
False



Отредактировано (Окт. 10, 2010 11:29:43)

Офлайн

#6 Окт. 10, 2010 11:33:47

Spectral
От:
Зарегистрирован: 2010-07-13
Сообщения: 51
Репутация: +  1  -
Профиль   Отправить e-mail  

Как "втолковать" функции, что данные - это лист?

Спасибо, guranvir, теперь буду знать.



Офлайн

#7 Окт. 11, 2010 04:39:16

АндрейК
От:
Зарегистрирован: 2010-09-11
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как "втолковать" функции, что данные - это лист?

Спасибо, даже не ожидал, что мне так подробно ответят и все разъяснят. Спасибо, ребята!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version