【Python】常用知识点

一、混淆知识点

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)
>>>
>>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇光_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值