python小知识

python中->

->常常出现在python函数定义的函数名后面为函数添加元数据,描述函数的返回类型,从而方便开发人员使用。比如:

通常的写法是:

def attrs(self) -> _Attrs:
    pass

这种写法通常是写在函数的函数名后面 

def add(x, y) -> int:
  return x+y

这里面,元数据表明了函数的返回值为int类型。
-> _Attr则表明函数返回的是一个外部可访问的类的私有变量。

@property

在阅读别人的源码的时候, 发现他大量的使用了这种方式定义函数:

@property
def attrs(self) -> _Attrs:
    pass

不知道其中的@property是做什么用的? 

这是一个python面向对象的编程问题,比较简单:

@property是一个装饰器,它能够使得类把一个方法变成属性调用的。

比如,python类中,我想要访问、设置私有变量,可以通过和C++类似的方式,如:

class Student(object):

    def get_score(self):
         return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value


s = Student()
s.set_score(60) # ok!
s.get_score()

不过,这样看起来有些麻烦,实际上python获取、设置类的变量(非私有变量)可以直接通过如下方式:

class Student(object):
    pass

s = Student()
s.score = 90
print(s.score) # 90

这样看起来是不是很简单?但是也有危险,这样对于类的变量的赋值的类型是不可确定的,无法对变量赋值类型进行检查限制,比如可以赋值为整数、字符串、boolean变量等。想要实现这样获取值、赋值,也不是不行,通过@property就可以实现:

class Student(object):
    @property
    def get_score(self):
         return self._score
    @property
    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

s = Student()
s.score = 90
print(s.score) # 90
s.score = '100' #报错

python中item和items区别: 

 Python中的item()和items()虽然一字之差但是用法却毫无关联,但是在搜索时经常会有人把他们搞混,所以博主就在这里为大家介绍一下这两种方法的用法。

item()

item()的作用是取出单元素张量的元素值并返回该值,保持该元素类型不变。
听起来和使用索引来取值的作用好像一样,接下来我们看一看使用两种方法取元素值的区别:
首先定义一个张量:

在这里插入图片描述
1、直接使用索引取值:

2、使用item()取出

由此可以看出使用item()函数取出的元素值的精度更高,所以在求损失函数等时我们一般用item()

items()

items()的作用是把字典中的每对key和value组成一个元组,并把这些元祖放在列表中返回。
举个例子:

 

Python中 _ 和 __ 的含义

学习链接:学习路径

Python中变量名后面加冒号是什么意思?

经查阅,这叫“变量注释”(variable annotations),Python3.6引入。

示例:

primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
    stats: Dict[str, int] = {}

Python 解释器不会附加任何特定的意义给variable annotations,仅仅把它们 存储在class或 module的__annotations__属性里.

目的是为:第三方工具或库,经由抽象语法树或__annotations__属性指定结构化类型的元数据。

def f(text:str,max_len:'int>0'=80) ->str:
	"""这个是函数的帮助说明文档,help时会显示"""
    return True
"""
函数声明中,text:str
text 是参数 :冒号后面  str是参数的注释。
如果参数有默认值,还要给注释,如下写。
max_len:'int>0'=80

->str 是函数返回值的注释。

这些注释信息都是函数的元信息,保存在f.__annotations__字典中、

需要注意,python对注释信息和f.__annotations__的一致性,不做检查
不做检查,不做强制,不做验证!什么都不做。
"""

python中如何指定import的文件目录

有一个文件夹/home/a, 里面有个模块叫b.py, 我怎么把他import到程序里?

方法一: 

import sys;
sys.path.append(“/home/a/”)
import b

注意:

sys.path.append("..") #把上级目录加入到变量中

sys.path.append("...") #把上上级目录加入到变量中

方法二:

  在目录里面增加__init__.py文件,里面可以写import时执行的代码,当然也可以留空就可以.
import home.a.b

方法三:

from home.a.b import *
前提 home、a中都包括__init__.py 即:要导入的文件的当前目录和父目录都要有init.py文件

Python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。
下面将具体介绍几种常用情况:

(1)主程序与模块程序在同一目录下:

如下面程序结构:
– src
  |– mod1.py
  |– test1.py

  若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *;

(2)主程序所在目录是模块所在目录的父(或祖辈)目录
如下面程序结构:
– src
|– mod1.py
|– mod2
  | – mod2.py
– test1.py

  若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.

(3)主程序导入上层目录中模块或其他目录(平级)下的模块
如下面程序结构:
– src
  |– mod1.py
  |– mod2
   |– mod2.py
  |– sub
    | – test2.py
  – test1.py
  若在程序test2.py中导入模块mod1.py和mod2.py。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立该文件。然后调用方式如下:
  下面程序执行方式均在程序文件所在目录下执行,如test2.py是在cd sub;之后执行python test2.py
而test1.py是在cd src;之后执行python test1.py; 不保证在src目录下执行python sub/test2.py成功。
import sys
sys.path.append(“..”)
import mod1
import mod2.mod2

(4)从(3)可以看出,导入模块关键是能够根据sys.path环境变量的值,找到具体模块的路径。这里仅介绍上面三种简单情况。

总结:

  通过总结可以发现,当你要导入的文件在和你的当前文件在同一个目录时,你直接导入这个文件名就好了。

  当你要导入的文件或者目录不和你的当前文件同目录时,你需要跳到这个你要导入文件的父级目录,然后一级一级的用点号连接走过的目录或者文件,然后就可以了 至于要怎么跳到这个这个父级目录。比较通用的就是,将父级目录加入系统路径,然后用点号一级一级的寻找,直到到达你要导入的模块。

assert的作用

assert:断言

格式:

assert 表达式 [, 参数]

当表达式为真时,程序继续往下执行;

当表达式为假时,抛出AssertionError错误,并将  参数  输出

举例:

def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'
    return 10 / n

foo('0')

# 代码执行结果
# AssertionError: n is zero!

python的操作globals()['key']()

python小知识_第1张图片

 学习路径:https://www.zhihu.com/question/387530280

Python list变量加星号,字典变量前面加星号

列表前面加星号作用是将列表解开成两个独立的参数,传入函数,

字典前面加1个星号,是将字典key解开成独立的元素作为形参。

字典前面加2个星号,是将字典value解开成独立的元素作为形参。

eg:

def add(a, b):
    return a+b
 
data = [4,3]
print (add(*data)) #输出7
data = {'a' : 4, 'b' : 3}
print (add(**data)) #输出7
print (add(*data)) #输出'ab'

上面是变量加*,函数加*参考下面:http://www.javashuo.com/article/p-beoimuet-cm.html

你可能感兴趣的:(计算机视觉应用)