python小白,关于函数问题
问题描述
第一段代码:
# -*- coding:gb2312 -*-def get_wendu(): wendu = 22 print('您输入的温度是%d'%wendu) return wendudef get_wendu_huashi(): wendu = wendu + 3 print('您输入的新温度是%d'%wendu)print('------1-------')wendu = get_wendu()print('------2-------')get_wendu_huashi()
第一段代码执行结果:
第二段代码:
# -*- coding:gb2312 -*-def get_wendu(): wendu = 22 print('您输入的温度是%d'%wendu) return wendudef get_wendu_huashi(): result = wendu + 3 #这里是对第一段代码的修正,把前面一个wendu改成了新的变量名称result print('您输入的新温度是%d'%result)print('------1-------')wendu = get_wendu()print('------2-------')get_wendu_huashi()
第二段代码执行结果:
我有两个问题:第一个问题:为什么wendu = get_wendu()这一句语句,执行出来的结果是:您输入的温度是22,这不只是一个赋值的语句么? 类似 wendu = 22,这样一句赋值,不是不会打印出来么,为什么wendu = get_wendu() 会打印出结果,难道函数里面的print语句,会在赋值的过程当中把这个东西打印出来?第二个问题:为什么第一段代码里面wendu = wendu + 3是错误的,换成result = wendu + 3就能够成功执行?是不是因为wendu = wendu + 3这句话在执行的过程中,遇到print('您输入的新温度是%d'%wendu),系统无法分辨wendu到底是前面一个wendu还是后面一个wendu?
问题解答
回答1:你的第一个问题其实是不懂语句的执行,wendu = get_wendu()这一句,get_wendu()这是一个表达式,它会返回一个值,这个值会被赋值给wendu这个变量,而get_wendu()这个表达式是执行函数,它会依次执行你函数体定义的语句,你在里面写了print,它自然会执行print。
你的第二个问题其实是不懂局部变量和全局变量的区别,print什么的一点影响都没有,只是因为变量引用不同导致的。先说你这里能够运行的语句。
def get_wendu_huashi(): result = wendu + 3
这里面,wendu 这个变量没有在函数内部声明定义,但是可以直接用,实际上引用的是全局变量wendu,也就是wendu = get_wendu()这里定义的变量。这也解释了result为啥打印的结果是22+3
而你不能运行的语句
def get_wendu_huashi(): wendu = wendu + 3 print('您输入的新温度是%d'%wendu)
这里实际上在函数内部作用域声明了一个新变量 wendu,它尚未被定义,而后wendu+3里的这个wendu变量就是引用了这个未定义的新变量,这自然而然的就造成了错误。
搞明白全局作用域和局部作用域就知道错在什么地方了。
回答2:get_wendu() 是一个函数调用,调用 get_wendu,get_wendu 里面 print('您输入的温度是%d'%wendu) 就是打印 wendu 这个局部变量的值
wendu = wendu + 3 是因为 wendu 这个变量还未定义,你就在使用它,由错误信息就可以看出来,UnboundLocalError: local variable ’wendu’ referenced before assignment
回答3:print('您输入的温度是%d'%wendu) 这句话不就是打印吗
python 默认会现在当前作用域寻找变量,由于在当前作用域没有 wendu 这个变量自然也就报错了。你可以在 wendu = wendu + 3 前加上一句 nonlocal wendu,这样就可以正常运行了
回答4:print()函数是向标准输出打印,
print('您输入的温度是%d'%wendu) # print会打印括号中的内容,%d表示格式化输出int类型, # 其实这句话和print(('您输入的温度是22')是等价的
报错信息是Local variable ’wendu’ referenced before assignment,说的是wendu变量在调用前 没有使用。相信你如果翻译了这个Error信息一定会惊呆了呢,命名在wendu = get_wendu()声明了但是竟然说没有,但是计算机也没有你想的那么低能= =,=是用来赋值的,它一定知道wendu是哪个wendu。原因对于函数内部变量赋值,Python会认为这个变量是局部变量,所以你的wendu此时是一个局部变量并不是global你可以尝试这样修改
def get_wendu_huashi(): global wendu wendu = wendu + 3 print('您输入的新温度是%d'%wendu)
变量名不要用拼音,变量名不要用拼音,变量名不要用拼音。全局变量尽量少用,按照你的要求,选择传参会更好。
相关文章: