快速提高编程能力--python之编程易错点深究2

文摘   科技   2023-05-02 21:14   河南  
Python,在上个世纪90年代末就已出现,距今也20多年了。如今,随着人工智能的迅速发展,python的欢迎度也在逐年提高,常年稳居编程语言排行榜前几名,在机器学习领域用途甚广。

相较于C语言,python语言可以说是简直不要太好学!然而,不要大意,在编程中仍然存在许多易错点,而这些往往非常难以发现,十分令人头疼。


 好,废话不多说,进入正题!!!


     

1,sort和sorted

a=[3,5,7,1,2]b=[3,5,7,1,2]c=a.sort()#list 的 sort 方法返回的是对已经存在的列表进行操作,所以c=Noneprint(a)print(c)d=sorted(b)#返回的是一个新的 listprint(b)print(d)
结果:[1, 2, 3, 5, 7]None[3, 5, 7, 1, 2][1, 2, 3, 5, 7]

解释:

sorted 函数对字符串,列表,元组,字典等对象进行排序操作。sort 是应用在list上的方法,sorted 可以对更多的数据类型进行排序操作。即便都是对列表操作,list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 返回的是一个新的 list而不是在原来的基础上进行的操作。

   

2,局部变量与全局变量


首先,先明确一点,那就是在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。相应的,处于局部作用域的变量被称为“局部变量”,而处于全局作用域的变量称为“全局变量”。变量就分为两种,所以一个变量要么是局部变量,要么是全局变量。


2.1局部变量不能在全局作用域中使用


def spam():    number=123#局部变量spam()print(number)结果:NameError: name 'number' is not defined


2.2局部作用域不能使用其它局部作用域内的变量


def spam():    number=123    getN()    print(number)def getN():    Data=1234    number=222spam()结果:123

解释:我们在调用spam()函数时,创建了一个局部作用域,局部变量number被赋值为123,然后,getN()函数被调用,也创建了一个局部作用域,这两个作用域同时存在,而在这个作用域中,Data被赋值为1234,number被赋值为222(注意:此作用域内的number不同于前一个)。重点:当getN()函数返回时,这次调用的局部作用域被销毁,getN()函数内的变量也就不复存在。而spam()的局部作用域仍然存在,程序继续执行,打印number的值为123。关键就是要知道,一个函数中的局部变量与其它函数中的局部变量是无关的。


2.3全局变量可以在局部作用域中使用


def spam():    print(number)number=1234#全局变量spam()结果:1234



2.4名称相同的全局变量和局部变量

事实上,python中全局变量和局部变量同名是完全合法的,但就是不太容易区分。建议看一下代码时,先不要看结果,心中有答案后再看。


def spam():    A="spam local"    print(A)#"spam local"def cpam():    A="cpam local"    print(A)#"cpam local"    spam()    print(A)#"cpam local"A="global"cpam()print(A)#"global"











结果:cpam localspam localcpam localglobal


解释:参考2.2,2.3,关键在于局部与全局。虽然,程序仍然完全正确,但是区分度不高,易混,所以在实际编程中应尽量避免这种现象。


2.5global语句

def spam():    global A#定义全局变量,而已经有全局变量A了,所以可以认为两者为一个。    A="spam"A="global"spam()print(A)结果:spam


当然,也许看完上面仍然有许多不理解的,那么下面请认真看这四条规律。

           1,如果变量在全局作用域中使用(所有函数之外),它就总是全局变量。      

           2,如果在一个函数中,有针对该变量的global语句,它就是全局变量。

            3,否则(接2),如果该变量用于函数中的赋值语句,它就是局部变量。

            4,但是,如果该变量没有用在赋值语句中,它就是全局变量。

        

def spam():    global egg    egg="spam"  #全局变量  符合2def bacon():    egg="bacon"  #局部变量  符合3def ham():    print(egg)  #全局变量 符合4egg=123  #全局变量,符合1spam()print(egg)

结果:spam


3,chr与ord


>>> ord('2')50>>> chr(50)'2'>>>


解释:

chr(x)与ord(x)函数用于在单字符和Unicode编码值之间进行转换。chr(x)函数返回Unicode编码对应的字符,而ord(x)函数返回单字符x对应的Unicode编码。


4,try except else finally


x,y=map(int,input().split())#输入两个整数try:    result=x/yexcept ZeroDivisionError:    print("0不能作为除数!")else:    print("result is",result)finally:    print("program end!")    运行(输入数据):1 0 结果:0不能作为除数!program end!
运行:2 4结果:result is 0.5program end!

python常见的标准异常!:



解释:如果try与except的语句块发生错误,则转到”except异常类型”语句中找到对应的异常类型,如果找到,则执行。如果try与except的语句块正常执行,则转到else语句块。无论程序是否正确,finally语句定会执行。



注意:以下代码有错误!Error!

def spam():    print(egg)    egg="green"egg=123  spam()


具体错误在哪,下次再聊!








math and code
计算机专业研究生在读,拥有深厚的计算机科学和数学背景,对编程、算法、数据结构、深度学习等领域都有着深入的了解和实践经验。对编程语言的掌握熟练而全面,无论是主流的Python、Java,还是强大的C++、Go,都能轻松驾驭。