【问题标题】:What Happens when Combining the 'in' Operator with the 'for in' Operator in Python?在 Python 中将 \'in\' 运算符与 \'for in\' 运算符结合使用会发生什么?
【发布时间】:2022-11-23 20:31:59
【问题描述】:

在 Python 中寻找安全的随机密码生成器时,我遇到了这个脚本:

# necessary imports
import secrets
import string

# define the alphabet
letters = string.ascii_letters
digits = string.digits
special_chars = string.punctuation

alphabet = letters + digits + special_chars

# fix password length
pwd_length = 12

# generate a password string
pwd = ''
for i in range(pwd_length):
  pwd += ''.join(secrets.choice(alphabet))

print(pwd)

# generate password meeting constraints
while True:
  pwd = ''
  for i in range(pwd_length):
    pwd += ''.join(secrets.choice(alphabet))

  if (any(char in special_chars for char in pwd) and 
      sum(char in digits for char in pwd)>=2):
          break
print(pwd)

来源:How to Create a Random Password Generator in Python - Geekflare 在最后的“if”语句中有一件事我不清楚,它检查生成的密码是否满足某些约束。

表达式是:

char in special_chars for char in pwd

我知道,“in”可以检查某物是否是可迭代对象的一部分,或者是从可迭代对象生成循环的“for in”语句的一部分。

但我不明白的是这两者在这里是如何相互作用的。在我看来,“char in special_chars”似乎检查“for char in pwd”中定义的第二个“char”是否是special_chars 的一部分。

但是:如何在定义“for in”中的“char”之前定义第一个“char”?我一直认为变量在定义之前无法访问。这个例子在我看来好像 Python 的行为有所不同。有人可以向我解释一下吗?

【问题讨论】:

  • 它叫做list comprehension,它有自己的语法。
  • @SembeiNorimaki 在那种情况下它是生成器表达式,但想法是一样的。

标签: python for-loop in-operator


【解决方案1】:

这被称为列表理解。

一个非常简单的例子是:

[i for i in range(5)] => [0, 1, 2, 3, 4]

现在,分解你的例子。

列表理解的后半部分for char in pwd 循环遍历密码中的每个字符。

现在第一部分 char in special_chars 根据 for char in pwd 循环中的当前字符是否为特殊字符给出 True 或 False 值。

我试图在下面展示一个基本示例

pwd = 'qw@rt&'
char in special_chars for char in pwd => [False, False, True, False, False, True]

any() 语句然后检查这个创建的列表以查看是否至少有一个 True 值

【讨论】:

  • 谢谢你。但是按照@matszwecja 的解释,它似乎是一个生成器表达式,其行为与列表理解非常相似:docs.python.org/3/reference/…
【解决方案2】:

感谢@matszwecja 我可以自己解释:

整个构造是一个所谓的生成器表达式: 6. Expressions -- Python 3.11.0 documentation

“生成器表达式中使用的变量在下一个() 方法为生成器对象调用(以与普通生成器相同的方式)。”

这向我解释了第一个“char”如何知道 for 循环中定义的第二个“char”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2020-05-28
    • 2012-07-11
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多