EX11: Asking Question
-
例子:
print("How old are you?", end=' ') age = input() print("How tall are you?", end=' ') height = input() print("How much do you weight?", end=' ') weight = input() print(f"So, you're {age} old, {height} tall and {weight} heavy.")
-
学习内容:
input()
;eval()
-
input()
-
以字符串的方式(
string
)获取用户输入输入:
a = input("age:") # 数据类型为string print(type(a)) # 返回数据类型 b = int(input("age:")) # 数据类型强制转换为整数型 print(type(b))
结果:
age:2 <class 'str'> age:3 <class 'int'>
第一段,返回
string
类型。第二段,用
int()
强制转换后,返回int
类型。 -
input()
括号中默认空,若需要输入提示,可以在括号中用引号写入相关提示,会在输入数据前显示。输入:
a = input("age:") print("age:", end="") b = input()
结果:
age:2 age:2
第一段和第二段可以等同。
-
-
eval()
-
python
的一个内置函数,返回传入字符串的表达式的结果。即变量赋值时,等号右边的表示是写成字符串的格式,返回值就是这个表达式的结果。
-
语法格式:
eval(expression, globals, locals)
expression – 表达式。
globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
- 字符串转字典
输入:
print(eval("{'name':'linux','age':18}"))
结果:
{'name': 'linux', 'age': 18}
- 当后两个参数都为空时,就是一个
string
类型的算术表达式,计算出结果即可。等价于eval(expression)
。
输入:
print(eval("1 + 2"))
结果:
3
- 当
locals
参数为空,globals
参数不为空时,先查找globals
参数中是否存在变量,并计算。
输入:
print(eval("{'name':'linux','age':age}",{"age":1822}))
结果:
{'name': 'linux', 'age': 1822}
- 当两个参数都不为空时,先查找
locals
参数,再查找globals
参数。
输入:
# 是locals()参数 age = 18 print(eval("{'name':'linux','age':age}",{"age":1822},locals()))
结果:
{'name': 'linux', 'age': 18}
-
-
-
改变代码(寻找可能情况及错误)
-
int(input())
和eval(input())
输入:
a = int(input("用int转换: ")) print("a的类型为: ", type(a)) print("a: ", a) b = eval(input("用eval转换: ")) print("b的类型为: ", type(b)) print("b: ", b)
结果:
1、输入整数:
用int转换: 2 a的类型为: <class 'int'> a: 2 用eval转换: 2 b的类型为: <class 'int'> b: 2
2、输入浮点数
用int转换: 1.1 Traceback (most recent call last): File "TEST.py", line 1, in <module> a = int(input("用int转换: ")) ValueError: invalid literal for int() with base 10: '1.1' 用eval转换: 1.1 b的类型为: <class 'float'> b: 1.1
从1和2可以看出,使用
int
规定数据类型后,只能输入整数。而
eval
则可以接受整数和浮点数,能识别出来。 -
eval()
输入:
a1 = eval(input('a1: ')) b1 = eval(input('b1: ')) print("a1 + b1 =", a1 + b1) print("a1数据类型: ", type(a1), " b1数据类型: ", type(b1)) a2 = eval("input('a2: ')") b2 = eval("input('b2: ')") print("a2 + b2 =", a2 + b2) print("a1数据类型: ", type(a2), " b1数据类型: ", type(b2))
结果:
1. 输入数字
a1: 1 b1: 2 a1 + b1 = 3 a1数据类型: <class 'int'> b1数据类型: <class 'int'> a2: 1 b2: 2 a2 + b2 = 12 a1数据类型: <class 'str'> b1数据类型: <class 'str'> a1: 2.1 b1: 1.1 a1 + b1 = 3.2 a1数据类型: <class 'float'> b1数据类型: <class 'float'> a2: 2.1 b2: 1.1 a2 + b2 = 2.11.1 a1数据类型: <class 'str'> b1数据类型: <class 'str'>
无引号,
a1 = eval(input('a1: '))
输出的数值类型由输入的数值类型决定。有引号,
a2 = eval("input('a2: ')")
和a2 = input('a2: ')
等同,输出的都是str
类型的数据。2. 输入字符串
eval(<字符串>)能够以Python表达式的方式解析并执行字符串,并将返回结果输出。
-
eval()
函数将去掉字符串的两个引号,将其解释为一个变量。对于
a1 = eval(input('a1: '))
所在的第一段代码:a1: hello Traceback (most recent call last): File "TEST.py", line 1, in <module> a1 = eval(input('a1: ')) File "<string>", line 1, in <module> NameError: name 'hello' is not defined
eval()
函数将去掉字符串的两个引号,将其解释为一个变量。input('a1: ')
执行后是str类型的字符串,eval()
函数去掉引号,使得系统认为是变量,所以这里现实的错误是:无法找到hello
变量。解决方法:(对于字符串,保证执行
eval()
还带着引号)如果
eval()
括号中没有引号,即eval(input('a1: '))
,要在输入字符串时加上引号,即"hello "
。如果
eval()
括号中有括号,即eval("input('a2: ')")
,则不需要在输入时加上引号,即hello
。a1: "hello " b1: "world" a1 + b1 = hello world a1数据类型: <class 'str'> b1数据类型: <class 'str'> a2: hello b2: world a2 + b2 = helloworld a1数据类型: <class 'str'> b1数据类型: <class 'str'>
3.
eval()
函数补充知识-
eval()
函数将去掉字符串的两个引号,将其解释为一个变量。 -
在处理数字时
单引号,双引号,三引号
eval()
函数都将其解释为int类型;单双引号混合使用解释为str
类型。输入:
a = eval("2") b = eval('2') c = eval("'2'") print("a 的类型: ", a, type(a)) print("b 的类型: ", b, type(b)) print("c 的类型: ", c, type(c))
结果:
a 的类型: 2 <class 'int'> b 的类型: 2 <class 'int'> c 的类型: 2 <class 'str'>
如果是
eval()
和input()
结合,在eval()
中,只要input()
被引号括起来,输出的就是str
类型。
-
-
我的GitHub中有详细的代码下载:https://github.com/YukyCookie/learn-python-three-the-hard-way.git