对于:
先说错误:
不过在具体解释之前,先针对其错误,给出自己的判断:
估计其输入代码时,最后一个括号是中文的括号,所以报错:
而之所以没说是%b引起的问题,是因为我自己调试了同样的代码后,知道如果是%b的话,会是另外不同错误提示:
ValueError: unsupported format character 'b' (0x62) at index 9
而不会是这里的:
SyntaxError: invalid character in identifier
解决办法:
把最后一个中文括号,改为正常的英文括号即可。
即:
weight))
而不是:
weight))
后记:
后来也故意去把正确的代码,改为错误的,最后用了个中文的括号,所以也会报错的:
且没有运行之前,pylint就可以识别和检测出来,并提醒错误:unexpected token ‘)’Python(parser-16)
以及:运行后也会报错:
<p> File "/Users/limao/dev/crifan/python/wrongExample/wrongExample.py", line 26</p><p> print("我叫%s,我今年%d岁,我的体重是%.2f公斤"%(name,age,weight))</p><p> ^</p> SyntaxError: invalid character in identifier
-》完美的验证了我第一次的推断,就是中文括号的问题。
这方面的问题的详细解释,参见:
【提醒】Python新手开发人员注意事项:不要误输入中文标点符号
接着再去说:
看到代码中,很多错误的写法。
且感觉是,被别人故意设计成这样的
对于代码本身,去整理和解释如下:
然后去调试了代码:
# Function: # 演示错误的代码,应该如何改为正确的代码 # Qpython3-CSDN论坛 # https://bbs.csdn.net/topics/395926666 # Author: Crifan Li # Update: 20200225 age=3 name=("tom") weight=55 print("我叫%s,我今年%b岁,我的体重是%.2f公斤"%(name,age,weight))
运行(肯定)会报错:
所以,应该改为:
# Function: # 演示错误的代码,应该如何改为正确的代码 # Qpython3-CSDN论坛 # https://bbs.csdn.net/topics/395926666 # Author: Crifan Li # Update: 20200225 age=3 # name=("tom") # weight=55 # print("我叫%s,我今年%b岁,我的体重是%.2f公斤"%(name,age,weight)) # ValueError: unsupported format character 'b' (0x62) at index 9 name="tom" # 显示指明是str字符串,而不是 看起来像是tuple元祖,实际上不是 weight=55.0 # 显示指明是float浮点数 # %d 用于格式化 integer整数 print("我叫%s,我今年%d岁,我的体重是%.2f公斤"%(name,age,weight)) # 我叫tom,我今年3岁,我的体重是55.00公斤
其中:
1.不要假装是tuple,但实际却是str
name=("tom")
是错误的示范和写法
因为(xxx, yyy)是标准的tuple元祖的写法
上述写法,容易让人误导,以为name是个tuple元祖变量
但是实际上,却等价于
name="tom"
name实际上是个str字符串变量
所以,本身,就应该改为,正常的,标准的写法:
name="tom"
才对。
加上type变量类型的打印,就容易对比看出区别了:
name=("tom") <p>print("type(name)=%s" % type(name)) # type(name)=<class 'str’></p><p>normlTupleValue = ("tom", "tony")</p><p>print("type(normlTupleValue)=%s" % type(normlTupleValue)) # type(normlTupleValue)=<class 'tuple'></p>
2.不要故意用错误的格式化写法
%d是用来格式化显示数字的
%b,是没见过的写法
即,此处的age是3岁,3个是integer整型数字,应该用%d去格式化输出,而不应该是%b
以及:weight=55
本意是:身体体重是55公斤
然后往往是个float浮点数,即有小数的部分的
所以后续是去用浮点数的%.2f去格式化显示的
但是此处初始化时的写法却是
weight=55
此时,weight是int= integer=整型
而不是我们希望的:
float=浮点数
应该改为:
weight=55.0
才对。
加上type变量类型的打印,就容易看出区别来了:
weight=55 <p>print("type(weight)=%s" % type(weight)) # type(weight)=<class 'int’></p><p>weight=55.0 # 显示指明是float浮点数</p><p>print("type(weight)=%s" % type(weight)) # type(weight)=<class 'float'></p>
最终完整代码是:
# Function: # 演示错误的代码,应该如何改为正确的代码 # Qpython3-CSDN论坛 # https://bbs.csdn.net/topics/395926666 # Author: Crifan Li # Update: 20200225
age=3
# name=(“tom”) # 看起来像是tuple元祖,实际上不是
# print(“type(name)=%s” % type(name)) # type(name)=<class ‘str’>
# normlTupleValue = (“tom”, “tony”)
# print(“type(normlTupleValue)=%s” % type(normlTupleValue)) # type(normlTupleValue)=<class ‘tuple’>
name=”tom” # 显示指明是str字符串
# weight=55
# print(“type(weight)=%s” % type(weight)) # type(weight)=<class ‘int’>
weight=55.0 # 显示指明是float浮点数
# print(“type(weight)=%s” % type(weight)) # type(weight)=<class ‘float’>
# print(“我叫%s,我今年%b岁,我的体重是%.2f公斤”%(name,age,weight))
# ValueError: unsupported format character ‘b’ (0x62) at index 9
# %d 用于格式化 integer整数
print(“我叫%s,我今年%d岁,我的体重是%.2f公斤”%(name,age,weight))
# 我叫tom,我今年3岁,我的体重是55.00公斤
调试输出效果:
附录:
1.关于print中变量的格式化的语法
转换符 | 含义 | 注释 |
‘d’ | 有符号十进制整数。 | |
‘i’ | 有符号十进制整数。 | |
‘o’ | 有符号八进制数。 | (1) |
‘u’ | 过时类型 — 等价于 ‘d’。 | (6) |
‘x’ | 有符号十六进制数(小写)。 | (2) |
‘X’ | 有符号十六进制数(大写)。 | (2) |
‘e’ | 浮点指数格式(小写)。 | (3) |
‘E’ | 浮点指数格式(大写)。 | (3) |
‘f’ | 浮点十进制格式。 | (3) |
‘F’ | 浮点十进制格式。 | (3) |
‘g’ | 浮点格式。 如果指数小于 -4 或不小于精度则使用小写指数格式,否则使用十进制格式。 | (4) |
‘G’ | 浮点格式。 如果指数小于 -4 或不小于精度则使用大写指数格式,否则使用十进制格式。 | (4) |
‘c’ | 单个字符(接受整数或单个字符的字符串)。 | |
‘r’ | (5) | |
‘s’ | (5) | |
‘a’ | (5) | |
‘%’ | 不转换参数,在结果中输出一个 ‘%’ 字符。 |
python字符串格式化符号:
符 号 | 描述 |
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %f 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
格式化操作符辅助指令:
符号 | 功能 |
* | 定义宽度或者小数点精度 |
– | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
<sp> | 在正数前面显示空格 |
# | 在八进制数前面显示零(‘0′),在十六进制前面显示’0x’或者’0X'(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
% | ‘%%’输出一个单一的’%’ |
(var) | 映射变量(字典参数) |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |