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’]()
   
     
   
    学习路径:
    
     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
    
   
 
