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