目录
疑难点汇总:
⚪1.如何一行中输入多个数据
⚪2.如何按照各种输出格式要求进行输出
⚪3.标识符与关键字的区分
⚪4.Python的变量(与C不同之处)
⚪5.int()函数补充
⚪6.Python中为什么没有++和--(自增和自减)
⚪7.在Python中的关系运算符可以连续使用,如1
⚪8.python中关于幂运算符的运算顺序(3**2**3)
⚪9.逻辑运算符优先级顺序(not,or,and)
⚪10.赋值语句赋值顺序如(i = x[i] = 3)
报错汇总:
⚪1.TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
⚪2.ValueError: invalid literal for int() with base 10
⚪3.TypeError: 'float' object cannot be interpreted as an integer
⚪1.如何一行中输入多个数据
input()是 Python内置函数,功能是接受标准的输入数据。无论用户输入什么内容,input()函数都以字符串类型返回结果。
例如输入1 2 或者 3,4
c = eval(input()) #一开始我只会一行输入一个... a,b = input().split() d,e = input().split(',') #利用字符串中的split方法,填入分隔符(默认为空格)即可 print(a, b, d, e)
输出如下:
⚪2.如何按照各种输出格式要求进行输出
print()也是Python内置函数,功能是输出运算结果。print()函数的语法格式如下:
print(*objects, sep='', end='\n', file=sys.stdout)
其中,objects表示输出的对象,输出多个时用逗号分隔;sep 用来分隔多个输出对象,默认为一个空格(输出显示时候用空格分开的,比如输入了1,2,3,输出是1 2 3); end 用来设定本次输出以什么结尾,默认是换行符\n;file表示想要写入的文件对象,默认是标准输入输出。
a,b,c,d = 1, 2, 3, 4 print(a) #输出一个 print(a,b,c,d) #输出多个 print(a,b,c,d,sep=',',end='!') #输出时的分隔符从空格改为逗号,且以感叹号结尾 print("\n本答案的输出分别是{},{},{},{}".format(a,b,c,d)) #也可以采用格式化输出方法format
其他格式化输出举例:
import math name = "张三" print("我的名字叫做%s" %name) print("我今年%d岁" %21) print("现在的时间是%02d:%02d" %(9,51)) print("圆周率为%.8f" %math.pi) print("第一个字母%c" %'a')
⚪3.标识符与关键字的区分
标识符:就是名称,就像我们每个人都有属于自己的姓名一样,标识符的作用就是作为变量、函数、类、模块和文件等对象的名称,以方便程序调用。
命名规则:由字母、数字、下划线3种字符组成,①不能以数字开头;②严格区分大小写;③不能和python种的关键字重名;④标识符不能是标准函数已经使用的名称,如print
合格标识符: a, abc123, abc_123,___,_ab_cd_12cc,myName,while_
非法标识符: 123, 123a,abc_,while,a.2,my-Name
关键字:又称保留字,它们是Python语言中的一些已经被赋予特定意义的单词。如False,True,if,else等
此外还有很多关键字,如图:
import keyword print(keyword.kwlist)
⚪4.Python的变量(与C不同之处)
首先,Python语言使用等号作为赋值运算符,具体格式为: 变量名 = 要存储的数据
①变量名是标志符的一种,因而也要遵守标识符的命名规则。
②C语言中,对于不同类型的数据,要声明不同的变量类型如int a,double b,等。但python中的变量不需要声明,但每个变量在使用前必须先赋值,赋值完之后变量才会被创建。值存放在内存中的某个位置,变量只是用于引用而已。
为了证明上面这句话,进行简单的代码实验:
x=3 print(id(x)) #注意,id(x)是返回地址的函数 x=7 print(id(x))
从图中可以看出他们俩返回的地址不同,这是为什么?
实质上,例如程序在执行语句x = 3时, Python要做以下三个事情。
①创建一个对象,即分配一块内存以存储数据3
②创建一个变量x,如果它还没有创建的话。
③将变量名x与对象关联起来,创建变量并使用变量引用对象。
那这次剖析一下代码就明白为什么了,代码如下:
x=3 print(id(x)) ''' 注意!这里的id(x)返回的是对象3的地址。''' x=7 print(id(x)) ''' 注意!这里的id(x)返回的是对象7的地址。'''
P.s.:在Python中,当一个变量名被赋予新的对象时, 之前赋予的那个对象(如果此时没有被其他的变量名或对象引用的话)占用的内存空间就会被回收。这种自动的内存管理过程被称为“垃圾收集”。
⚪5.int()函数补充
class int(object) | int([x]) -> integer | int(x, base=10) -> integer
① int(x)是将符合数学格式的数字型字符串x转换成整数,获将浮点数转换成整数,取整。
例如:int(6.5) 返回 6;int("123") 返回 123;int() 返回 0 (无参数时返回0)
② int(x, base = 10) 则是 将 base进制的x字符串 转换成对应的十进制整数
例如:int("aa",16) 返回 170(aa是十六进制数,转换成十进制通过公式就是 10*16^1 + 10*16^0 = 170); int("1100",2) 返回 12 (1100是二进制数,转换成十进制通过公式就是1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 12。
其他例子:
print(int()) print(int(3.6)) print(int("12", 16)) print(int("1010", 2)) print(int("aa",16)) print(int("1100", 2))
详细内容可以通过help(int())查看:
class int(object) | int([x]) -> integer | int(x, base=10) -> integer | | Convert a number or string to an integer, or return 0 if no arguments | are given. If x is a number, return x.__int__(). For floating point | numbers, this truncates towards zero. | | If x is not a number or if base is given, then x must be a string, | bytes, or bytearray instance representing an integer literal in the | given base. The literal can be preceded by '+' or '-' and be surrounded | by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. | Base 0 means to interpret the base from the string as an integer literal. | >>> int('0b100', base=0) | 4
⚪6.Python中为什么没有++和--(自增和自减)
C语言中是有++ 和 -- 的, 而Python没有,当初我不以为然,深究以后才发现并不简单。在上面《4.Python的变量》中我们知道Python的值存放在内存中的某个位置,变量只是用于引用。
举个例子:
x = 1 y = 2 print(id(x), id(y)) '''输出 140733434824352 140733434824384''' ''' 程序在执行语句x = 1时,Python要首先创建一个对象, 即分配一块内存以存储数据1,再创建一个变量x(如果 它还没有创建的话),再将变量名x与对象关联起来,创建变量 并使用变量引用对象。 所以id(x)返回的是对象1的地址;id(y)返回的是对象2的地址 ''' z = 1 '''为了验证,这时我再赋值一个变量,并且引用先前存在的对象1''' print(id(z)) '''输出 140733434824352 输出发现,id(z)返回的值和id(x)返回的值是一模一样的,也就是说 他们引用的同样的内存地址''' ''' 如果这时按照C语言一样增加自增(++)操作,python应该是将内存中存储的值给+1,如x++, x引用的是对象1,值++的话,当前内存地址中存储的值要变成2,但这会导致 引用同一个对象的x 和 z 他们引用的值全变为了2,而本意并没有想让z也自增。 所以python中正确的自增操作应该是 x = x + 1,这样的话, x = x引用的的值 + 1 x 再去引用(x引用的值+1)这个对象。 下面做个x = x + 1实验 ''' x = x + 1 print(id(x)) '''输出 140733434824384 可以发现x = x + 1后的id(x)返回的内存地址和id(y)返回的内存地址一样,这是因为 他们共同引用了对象2,所以这种自增操作后,x就已经是新对象的名称,而并不会影响z。 那为什么c可以有自增/减(++/--)操作呢,那是因为它是以变量名为基准,而python中的变量是以内容为基准。 '''
⚪7.在Python中的关系运算符可以连续使用,如1
1 < a < 5 等价于 1 < a and a < 5
举例:
a = 9 if 2 < a < 10: print("yes") else: print("no")
a = 11 if 2 < a < 10: print("yes") else: print("no")
⚪8.python中关于幂运算符的运算顺序(3**2**3)
我以为的(错误示范): 3**2 = 9, 再 9**3 = 729
其实是(正确示范):3**(2**3 = 8 ), 再3**8 = 6561
为什么?
很简单的原因:将3**2**3转换成我们常见的上下标形式, 那肯定是先算啦!
⚪9.逻辑运算符优先级顺序(not,or,and)
优先级顺序: not > and > or
举三个例子(注释有解释):
(对下面代码中第一个例子进行详细说明,当a = 5, b = 2, c = 5, d = false时, 问 not d or a >= b and a >= 5 or c >= b or not d 返回True 还是False。通过优先级顺序所知,先看not,所以先看not后的逻辑值,为True or a >= b and a >= 5 or c >= b or True, 再对and求逻辑值,最后再看or 就可以了)
a = 5 b = 2 c = 5 d = False print(not d or a >= b and a >= 5 or c >= b or not d) ''' # True or a >= b and a >= 5 or c >= b or True # True or True or c >= b or True # True or True or True or True # True #__________________________________''' d = True print(not d or a >= b and a >= 6 or c >= 6 or not d) ''' # False or a >= b and a >= 6 or c >= 6 or False # False or False or c >= 6 or False # False or False or False or False # False #__________________________________''' d = True print(not d or a >= b and a >= 5 or c >= 6 or not d) ''' # False or a >= b and a >= 5 or c >= 6 or False # False or True or c >= 6 or False # False or True or False or False # True'''
注意事项:首先仔细看下面python中的逻辑运算符的功能描述
所以对于如这类表达式 ((2>=2) or (2<2)) and 2 应当返回2 , 因为该表达式等于 = (True or False) and 2 -----> True and 2, 因为左边为True所以返回2。
运算符及表达式 功能描述 x and y 逻辑与: 如果x的值为False, 返回False, 否则返回y的值 x or y 逻辑或:如果x的值为True, 返回x的值,否则返回y的值 not x 逻辑非:如果x的值为True, 返回False;如果x的值为False, 返回True
⚪10.赋值语句赋值顺序如(i = x[i] = 3)
首先看一道题目:
这道题的实际输出是 [1, 2, 3, 3, 5],但我一直没明白,后来通过网上查阅资料才明白。
举个例子x = y = z = 5, 我们简单看一下输出。
x = 0 y = 0 z = 0 x = y = z = 5 print(x, y, z)
我们通常以为程序首先执行z = 5 , 然后再执行y = z, 最后再执行 x = y, 所以输出[5, 5, 5]
但接下来的例子就会解释不通,如下图代码:
x = [1, 2, 3, 4, 5] i = 0 i = x[i] = 3 print(x)
按上面的顺序的话, 应该是首先x[i] = 3, 即x[0] = 3, 再 i = x[0], 即i = 3, 那么最后输出应该是
原因:先看第一个例子 x = y = z = 5, 其实python 真正的执行顺序是x = 5;y = 5;z = 5,然后最后输出[5,5,5].
再看第二个例子,实际上是先执行i = 3, 再执行x[i] = 3, 所以最后输出为[1, 2, 3, 3, 5].
⚪1.TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
译:类型错误:int()参数必须是字符串、对象或数字之类的字节,而不是“list”
问题代码示例(运行将会报错):
n,m=int(input().split()) print(n+m)
原因:假如输入30 50, 首先input()传入字符串"30 50",再通过split 默认以空格为分隔符分割成了['30','50']的字符串list,但是int()参数不能是list,所以导致了报错。
可以修改为:
n,m=input().split() n = int(n) m = int(m) print(n+m)
或
str = input() n = int(str.split()[0]) m = int(str.split()[1]) print(n + m)
⚪2.ValueError: invalid literal for int() with base 10
问题代码示例(运行将会报错):
''' 错误样例1''' y = int("10.0") print(y) ''' 错误样例2 , 当用户输入 10.0 时将报错! ''' x = int(input()) print(x)
原因:根据现有语法规定,int(x), x如果为字符串,当从字符串转整数时,要为整数才可以直接转。解决方法就是先转成float, 再从float转成int。
样例1修改:
''' 修改样例1''' y = int(10.0) print(y)
(因为int函数中的x为10.0的float类型,可以强转成int类型,但只是简单地取整而非四舍五入。)
样例2修改:
''' 修改样例2 , 当用户输入 10.0 时输出10 ''' x = int(float(input())) print(x)
⚪3.TypeError: 'float' object cannot be interpreted as an integer
译:类型错误:“float”对象不能解释为整数
问题代码示例(运行将会报错):
print(bin(12.5)) print(oct(12.5)) print(hex(12.5)) '''以上三个输出都会导致报错'''
原因:可以利用help()函数查阅bin(),oct(),hex()函数的使用方法,这些Python内置函数要求参数为整数, 所以当出现此类型报错时,多关注是否是由于参数不符合要求。
P.s.:除上述问题外呢,也有可能是因为python3不向后兼容python2导致的,因为在python2中的 /(除符号) 只留整数部分,去掉小数;而python3中的/是真正意义上的除法,结果是float型浮点数,python3中的//等价于python2中的/。
——————————————————持续更新中———————————————————
P.s:文章小部分参考教材《Python语言程序设计入门》