在函数中进行复位和在Python IDE中进行打印之间的区别

时间:2016-11-19 10:16:52

标签: python

给定一个字符串,用字母表中的位置替换每个字母。如果文本中的任何内容都不是字母,请忽略它并且不要将其退回。 a为1,b为2,等等。例如:

alphabet_position("The sunset sets at twelve o' clock.")

应该返回"20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11"(作为字符串。)

cc = "The sunset sets at twelve o' clock."
for i in cc:
    if ord(i) >= 97 and ord(i) <= 122:
        s = ord(i)-96,
        print ''.join(map(str, s)),

    elif ord(i)>=65 and ord(i) <= 90:
        ss = ord(i)-64,
        print ''.join(map(str, ss)),

输出:20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11

在函数内部使用时引发的错误:

def alphabet_position(text):

    for i in text:
        if ord(i) >= 97 and ord(i) <= 122:
           s= ord(i)-96
           return ''.join(map(str, s)),
        elif ord(i) >= 65 and ord(i) <= 90:
           ss= ord(i)-64
           return ''.join(map(str, ss)),

Traceback (most recent call last):
  File "/Users/greatergood/Desktop/acsii2.py", line 10, in <module>
    print alphabet_position("The sunset sets at twelve o' clock.")
  File "/Users/greatergood/Desktop/acsii2.py", line 8, in alphabet_position
    return ''.join(map(str, ss)),
TypeError: argument 2 to map() must support iteration

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:1)

map(function, iterable, ...)
  

将函数应用于iterable的每个项目并返回结果列表。如果传递了其他可迭代参数,则函数必须采用那么多参数,并且并行地应用于所有迭代的项。如果一个iterable比另一个短,则假定使用None项扩展。如果function为None,则假定为identity函数;如果有多个参数,map()返回一个由包含所有迭代中相应项的元组组成的列表(一种转置操作)。可迭代参数可以是序列或任何可迭代对象;结果始终是一个列表。 https://docs.python.org/2/library/functions.html#map

您的论据sssintegers,因此不是iterable

这是你想要达到的目标吗?

def alphabet_position(text):
    list_of_alphabet = []
    for i in text:
        if ord(i) >= 97 and ord(i) <= 122:
           s = ord(i) - 96
           list_of_alphabet.append(s)
        elif ord(i) >= 65 and ord(i) <= 90:
           ss = ord(i) - 64
           list_of_alphabet.append(ss)

    return list_of_alphabet 

list_of_alphabet = alphabet_position("The sunset sets at twelve o' clock.")
print list_of_alphabet

答案 1 :(得分:1)

您的非功能变体是偶然的。 您在作业结束时放了一个逗号 s = ord(i)-96,ss = ord(i)-64, 这使得sss成为一个元组 因此map意外地工作。 在您的功能版本中,您省略了悬空逗号, 因此map停止工作。

比较这些:

s = ord('t') - 96,
print type(s)

s = ord('t') - 96
print type(s)

请注意,您的代码还有其他一些问题。

答案 2 :(得分:0)

正如mkiever所说,您的第一个版本似乎有效,因为您将sss转换为元组。尽管我们经常用括号编写元组,但它们实际上是通过使用逗号创建的。只有在没有它们的情况下代码不明确时才需要括号。

目前尚不清楚你为什么要做map(str, s)map用于将函数应用于可迭代的每个项目,而不是单个项目。要将s这样的单个整数转换为字符串,您只需执行str(s)

您可以通过将字母转换为相同的大小写来简化测试,而不是分别处理大写和小写。

def letter_ord(c):
    return str(ord(c.upper()) - 64) if c.isalpha() else ''

cc = "The sunset sets at twelve o' clock."
a = [letter_ord(c) for c in cc]
print(' '.join([u for u in a if u]))

<强>输出

20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11

或者作为一个单行:

cc = "The sunset sets at twelve o' clock."
print(' '.join(filter(None, map(lambda c: str(ord(c.upper()) - 64) if c.isalpha() else '', cc))))