【问题标题】:How does python know the word is a str? [closed]python怎么知道这个词是str? [关闭]
【发布时间】:2022-01-19 02:12:43
【问题描述】:

我试图了解python究竟是如何知道单词变量在这里实际上是一个单词:

for word in file.read().lower().split():

此处的文件是一个 .txt 文件,这是在此函数之前定义的唯一内容。另外,导入的集合模块

我是初学者,如果有人能在这里向我解释这可能是超级基本的基本知识,我将不胜感激。

【问题讨论】:

  • 因为每个“值”都带有它的“类型”,而不是每个“变量”
  • 每当你调用一个函数(如.read().lower()等,甚至像print()这样的函数)它都有一个返回值。对于print(),即None,您通常会忽略它,但对于像.split() 这样的函数,返回类型是字符串列表——因此,如果您使用for 循环遍历该列表,则循环变量@987654328 @ 将被分配该列表中的元素,即字符串 str - @donkopotamus 是正确的,类型与值相关联(这里是函数返回的值)并且变量只是分配了该值(并且具有结果输入)
  • "python 究竟是如何知道这个词变量在这里实际上是一个词:" 我不明白你为什么认为它确实“知道”任何这样的事情。我也不清楚哪个是问题 - 关于它是 string (如标题)还是“单词”(如问题本身)。但是“单词”在 Python 中并不是一个单独的类型,它们只是恰好代表一个单词的字符串。就像“奇数”不是特殊类型一样;它们只是碰巧不能被 2 整除的整数。
  • 欢迎来到 Stack Overflow。您似乎对语言的某些方面的工作方式普遍缺乏了解,并且由于您没有该基础而难以正确解释问题。您可能应该尝试按照教程而不是在这里询问。很难正确回答这个问题,因为在你想用来思考情况的术语中,没有一个有意义的问题。
  • 您没有定义word 是什么;也就是说,您可能将自己对word“应该是”的理解与您使用的变量名混为一谈。

标签: python string


【解决方案1】:

在你的代码中分解它(假设你有类似open的东西):

with open('my.txt') as file:
    for word in file.read().lower().split():
        ...
  • file 是一个文件,特别是一个文本文件,因为没有传递 'b' 来表示它是一个二进制文件
  • 调用file.read()会返回文件的内容,因为它知道这是一个文本文件,所以该函数返回一个字符串值
  • 因此调用file.read().lower() 就是在该字符串值上调用.lower() 并且 还返回一个字符串值(整个字符串,小写)
  • 最后,file.read().lower().split()那个 字符串值进行操作,将其拆分为 list,特别是 str 的列表
  • for word in <some iterable> 因此循环了liststr,这就是为什么word 的值在for 循环体中将是str - 文本文件中的每个小写单词,一次一个每次迭代。

如果命名引起混淆:变量名为word这一事实与分配给它的值的类型无关。这段代码的作用完全相同,square 将是一个字符串:

with open('my.txt') as blue:
    for square in blue.read().lower().split():
        ...

变量名由程序员决定,必须遵循一些规则,但不“意味着”任何东西。函数名称由编写它们所在模块的人决定,因此.read().lower() 等已由 Python 本身的设计者命名。

函数可以根据各种因素返回不同类型的值。例如,下面是一个函数,它给一个值加一,但保持值的类型不变:

def add_one(x):
    if isinstance(x, (float, int)):
        # this works for either a float or an int, Python's + leaves that alone
        return x + 1
    elif isinstance(x, str):
        try:
            # perhaps it's an integer literal
            return str(int(x) + 1)
        except ValueError:
            try:
                # or perhaps a float literal
                return str(float(x) + 1)
            except ValueError:
                raise ValueError(f'x is a string, but not a float or int: {e}')
    else:
        raise ValueError('unsupported type for add_one: {type(x)}')


x = 1
x = add_one(x)  # x still an int
y = 1.0
y = add_one(y)  # y still a float
a = '1'
a = add_one(a)  # a still a string (of an int)
b = '1.0'
b = add_one(b)  # a still a string (of a float)

# make python print what the values would look like in a Python list
print(repr([x, y, a, b]))

# but the next line fails with an exception
c = 'one'
c = add_one(c)

结束打印:

[2, 2.0, '2', '2.0']

然后失败了

ValueError: x is a string, but not a float or int: could not convert string to float: 'one'

【讨论】:

  • 非常感谢!现在很有意义。
  • 不客气 - 随意勾选复选标记接受答案,因此问题不再显示为未回答。这有助于其他人找到答案,并防止回答问题的人将时间花在已经回答的问题上。
  • 太好了,刚刚做到了。谢谢!!
猜你喜欢
  • 2011-11-05
  • 1970-01-01
  • 2021-09-18
  • 2019-06-14
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多