我有一个python代码,我需要在for循环和if语句之外获取它的值并进一步使用该变量:
我的代码:
with open('text','r') as f:
for line in f.readlines():
if 'hi' in line
a='hello'
print a #variable requires outside the loop
但我得到Nameerror: 'a' is not defined
答案 0 :(得分:6)
错误消息表示您从未分配到a
(即if
条件从未评估为True
)。
为了更优雅地处理这个问题,你应该在循环之前为a
分配一个默认值:
a = None
with open('test', 'r') as f:
...
然后,您可以在循环后检查它是否为None
:
if a is not None:
...
答案 1 :(得分:3)
您也可以尝试:
try:
print a
except NameError:
print 'Failed to set "a"'
编辑: 如果你没找到你想要的东西,它同时解决了不打印 a 的问题
答案 2 :(得分:2)
此处的其他答案是正确的 - 您需要保证在尝试打印之前已为a
分配了值。但是,其他答案都没有提及Python's for ... else
construct,我认为正好你需要的是什么:
with open('text','r') as f:
for line in f.readlines():
if 'hi' in line:
a='hello'
break
else:
a='value not found'
print a #variable requires outside the loop
else
子句仅在for
循环完成其最后一次迭代而没有break
时才会运行。
根据我的经验,这个结构似乎是Python独有的。它可以很容易地用支持goto
的语言实现,但Python是我所知道的唯一一种专门用于此的内置构造的语言。如果你知道另一种这样的语言,请发表评论并启发我!
答案 3 :(得分:-1)
只需定义app.js
或 const rateLimit = require('express-rate-limit');
const rateLimiter = rateLimit({
windowMs: 1 * 60 * 1000,
max: 5,
statusCode : 403,
message: 'You have exceeded the 5 requests in 1 min limit!',
headers: true,
});
router.get("/call_api", checkauth,rateLimiter, async function(req,res,next) {
await fetch("http://localhost:8000/get_number", {
method : "GET",
// headers: {'Content-Type': 'application/json'},
})
.then((response) => response.json()).then((response1) => {
res.status(200).json({
number : response1.number
});
})
// res.status(200).json({
// message : "Generating a random number"
// })
});
router.get("/remaining_limit",checkauth,rateLimiter, (req,res) => {
res.status(500).json({
remaining_limits : "You have _ remaining limits" //the number of remaining limits
});
})
因此成为一个全局变量,您就可以在代码中的任意位置访问