一、混淆知识点
1. 变量作用域
- Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
>>> if True:
... msg = 'I am from Runoob'
...
>>> msg
'I am from Runoob'
>>>
- global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字了。
#!/usr/bin/python3
num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num)
num = 123
print(num)
fun1()
print(num)
#!/usr/bin/python3
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
2. @property 的用法
类/装饰器
@property装饰器负责把类中的方法转换成属性来调用
有三种调用方法
方法一:@property直接加在需要转换的方法上
class People:
def __init__(self, name, weight, height):
self.__name = name
self.weight = weight
self.height = height
@property
def bmi(self):
return self.weight / (self.height ** 2)
test1 = People('nana', 50, 1.5)
print(test1.bmi)
方法二:属性名称=property(方法名1,方法名2,…)
class People:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height
def get_name(self):
return self.name
def set_name(self, val):
if type(val) is not str:
print('must type(str)')
return
self.name = val
def del_name(self):
print("warning:can't do it")
name_test = property(get_name, set_name, del_name)
obj1 = People('nana', 50, 1.5)
print(obj1.name_test)
obj1.name_test = 'NANA'
print(obj1.name_test)
del obj1.name_test
方法三:首先将需要转换的方法统一成一个名称,相应的方法上添加相应的@名称
推荐使用
把一个getter方法变成属性,只需要加上@property就可以了,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值。
class People:
def __init__(self, name, weight, height):
self.__name = name
self.weight = weight
self.height = height
@property
def namess(self):
return self.__name
@namess.setter
def namess(self,val):
if type(val) is not str:
print('must type(str)')
return
self.__name=val
@namess.deleter
def namess(self):
print('NO DEL')
obj2=People('simon',74,1.8)
print(obj2.namess)
obj2.namess='Tom'
print(obj2.namess)
del obj2.namess
3. Numpy数组中None的作用
可以看出,在数组索引中,加入None就相当于在对应维度加一维
但是这种方法只是在ndarray和tensor类型使用,python的list并不适用(会报错)
>>> import numpy as np
>a=[1,2,3,4]
>>> a=np.array(a)
>>> a
array([1, 2, 3, 4])
>>> b=a[:,None]
>>> b
array([[1],
[2],
[3],
[4]])
>>> c=a[:,None,None]
>>> c
array([[[1]],
[[2]],
[[3]],
[[4]]])
>>> a=np.ones((2,3))
>>> a
array([[1., 1., 1.],
[1., 1., 1.]])
>>> b=a[:,None,:]
>>> b
array([[[1., 1., 1.]],
[[1., 1., 1.]]])
>>> b=a[None,:,:]
>>> b
array([[[1., 1., 1.],
[1., 1., 1.]]])
在pytorch中:
>>> import torch as t
>>> a=t.from_numpy(a)
>>> a
tensor([[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
>>> b=a[:,None,:]
>>> b
tensor([[[1., 1., 1.]],
[[1., 1., 1.]]], dtype=torch.float64)
>>>
>>>