Python语言程序设计入门学习(疑难点及各种报错汇总)

目录

疑难点汇总: 

⚪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 用来设定本次输出以什么结尾,默认是换行符\nfile表示想要写入的文件对象,默认是标准输入输出。

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<a<5

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中的逻辑运算符的功能描述

运算符及表达式功能描述
x and y 逻辑与: 如果x的值为False, 返回False, 否则返回y的值
x or y逻辑或:如果x的值为True, 返回x的值,否则返回y的值
not x逻辑非:如果x的值为True, 返回False;如果x的值为False, 返回True
所以对于如这类表达式 ((2>=2) or (2<2)) and 2 应当返回2 因为该表达式等于 = (True or False) and 2 -----> True and 2,  因为左边为True所以返回2。

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, 那么最后输出应该是

[3,2,3,4,5], 然而输出却是

原因:先看第一个例子 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语言程序设计入门》

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值