13

我有一个可以工作的 python 脚本,但在 python 3 中肯定发生了一些变化。

例如,如果我想将参数 1 转换为小写:

import string
print(string.lower(sys.argv[1]))

它说'module' object has no attribute 'lower'- 好吧,我明白了,string现在是一个模块。

如果我删除导入,并且只写string.lower('FOO'),它会抱怨name 'string' is not defined.

那么将字符串转换为小写的正确方法是什么?

4

4 回答 4

16

您可以使用sys.argv[1].lower()

>>> "FOo".lower()
'foo'

lower()是字符串对象本身的一种方法。

string模块在 Python 3 中已更改,它不再包含与str对象相关的方法,现在只包含下面提到的常量。

您也可以使用str.lower("Mystring"),但这里没有必要,因为您可以简单地使用"Mystring".lower().

>>> import string  # Python 3
>>> dir(string)
['ChainMap', 'Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
于 2013-05-20T05:33:56.210 回答
5

str不是string

>>> str.lower("HELLO")
'hello'

因此,您收到name 'string' is not defined.错误的原因是范围内当前不存在名为string.

于 2013-05-20T05:36:17.520 回答
3

面向对象的正确方法是:

'FOO'.lower()

在您的示例中:

print(sys.argv[1].lower())
于 2013-05-20T05:45:50.883 回答
3

另外,虽然有些人更喜欢面向对象的方式(调用 str 对象的方法),但有些人可能仍然喜欢旧的方式——使用函数或运算符。这也取决于要解决的问题。(如果您不同意,请考虑例如(1.5).__add__(3)。)

您可以轻松地为需要使其更具可读性的函数创建自己的(更简单的)名称。你只应该考虑它是否对每个人都可读(将来对你和现在):

>>> lower = str.lower
>>> lower('SoMe CaPiTaL LetTerS to Be LoWeRED')
'some capital letters to be lowered'
于 2013-05-20T10:34:34.620 回答