Python易错知识点--try/except、变量作用域、字典

1、定义函数,程序执行时,会跳过其中的代码,调用时才执行其中的代码

2、局部变量和全局变量

如果存在同名局部变量和全局变量,并且试图在局部变量赋值前使用全局变量,会报错:

def spam():
    print(eggs)
    eggs='spam local'

eggs = 'global'
spam()

程序运行会报错:

File "D:/Program Files (x86)/python_code/t1/t3.py", line 1
def spam():
^
IndentationError: unexpected indent

因为spam()有对eggs的赋值,因此认定eggs为局部变量,print(eggs)在赋值之前执行,此刻eggs并不存在,python不会退回去使用全局变量。

3、try/except的范围

def spam(dividedBy):
    return 42/dividedBy
   
try:
    print(spam(2))
    print(spam(0))
    print(spam(1))
except ZeroDividedError:
    print('Error:Invalid argument!')

程序运行结果:

21.0
Error:Invalid argument!

可以发现print(spam(1))没有执行,因为程序一旦跳到except子句的代码,就不会再回到try子句了。

4、用列表便捷为多个变量赋值

控制变量的数目和列表长度严格相等:

cat=['black','red','blue']
cat1,cat2,cat3=cat
print(cat1,cat2,cat3)

运行结果:

black red blue 

5、引用----变量赋值VS列表赋值

(1)变量赋值

spam=42
cheese=spam
spam=100
print("spam",spam)
print ("cheese",cheese)

程序运行结果:

spam 100
cheese 42

(2)列表赋值

spam=[0,1,2,3,4]
cheese=spam
spam[1]='ABC'
print('spam=',spam)
print('cheese=',cheese)

程序运行结果:

spam= [0, 'ABC', 2, 3, 4]
cheese= [0, 'ABC', 2, 3, 4]

第二行代码只是将spam的列表引用拷贝到了cheese,而不是复制列表本身,所以存储在spam和cheese中的两个值,指向同一个列表。

(3)copy模块

如果修改赋值后的列表,二不想影响原来的列表,可以采用copy模块的copy()方法

import copy
spam=[0,1,2,3,4]
cheese=copy.copy(spam)
cheese[1]='ABC'
print('spam=',spam)
print('cheese=',cheese)

程序运行结果:

spam= [0, 1, 2, 3, 4]
cheese= [0, 'ABC', 2, 3, 4]

cheese=copy.copy(spam)创建了第二个列表,spam和cheese分别指向独立的列表。

如果列表中还含有列表,就需要使用deepcopy()函数

6、统计嵌套字典中,内层字典的指定键的值之和

allGuests={
'Alice':{'apple':5,'pear':6},
'Bob':{'apple':2,'meat':2},
'Paul':{'cake':6,'pear':3}
}

def total(guest,food):
    num=0
    for k,v in guest.items():
        num=num+v.get(food,0)
    return num
print('apple:'+str(total(allGuests,'apple')))
print('pear:'+str(total(allGuests,'pear')))
print('cake:'+str(total(allGuests,'cake')))
print('meat:'+str(total(allGuests,'meat')))

你可能感兴趣的:(Python易错知识点--try/except、变量作用域、字典)