python小知识

  • Post author:
  • Post category: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’]()

学习路径:

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



版权声明:本文为qq_38455499原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。