在Python(特别是Python 3.0,但我认为不重要)中,如何在具有连续字符代码的字符序列上轻松编写循环?我想做像这样的伪代码:
for Ch from 'a' to 'z' inclusive: # f(Ch)
示例:以下是一个不错的"pythonic"版本怎么样?
def Pangram(Str): ''' Returns True if Str contains the whole alphabet, else False ''' for Ch from 'a' to 'z' inclusive: # M[Ch] = False for J in range(len(Str)): Ch = lower(Str[J]) if 'a' <= Ch <= 'z': M[Ch] = True return reduce(and, M['a'] to M['z'] inclusive) #
标记为#的行是伪代码.当然reduce()是真正的Python!
亲爱的巫师(特别是古老的灰胡子巫师),也许你可以说我最喜欢的语言曾经是帕斯卡.
在调用的字符串模块中有一个常量ascii_lowercase
,试试看:
>>> from string import ascii_lowercase
然后,您可以迭代该字符串中的字符.
>>> for i in ascii_lowercase : ... f(i)
对于你的pangram问题,有一种非常简单的方法可以找出一个字符串是否包含字母表中的所有字母.像以前一样使用ascii_lowercase,
>>> def pangram(str) : ... return set(ascii_lowercase).issubset(set(str))
用你需要的所有字符迭代常量是非常Pythonic.但是,如果您不想导入任何内容并且只使用Unicode,请使用内置函数ord()及其反向chr().
for code in range(ord('a'), ord('z') + 1): print chr(code)
你必须抛弃Pascal-isms并以全新的视角学习Python.
>>> ascii_lowercase 'abcdefghijklmnopqrstuvwxyz' >>> def pangram( source ): return all(c in source for c in ascii_lowercase) >>> pangram('hi mom') False >>> pangram(ascii_lowercase) True
通过将自己限制在Pascal提供的内容中,您会错过Python提供的内容.
并且......尽量避免reduce
.它经常导致可怕的性能问题.
编辑.这是另一种表述; 这个实现了集交集.
>>> def pangram( source ): >>> notused= [ c for c in ascii_lowercase if c not in source ] >>> return len(notused) == 0
这个给你一个诊断信息,用于确定候选pangram中缺少哪些字母.