张德长

导航

Python学习笔记3

Python学习笔记3

 

 

pip的路径问题

pip安装路径问题

D:\ProgramFile\python-3.6.6-amd64\Lib\site.py

 

# for distutils.commands.install

# These values are initialized by the getuserbase() and getusersitepackages()

# functions, through the main() function when Python starts.

USER_SITE = "D:\Python\python3.6.6\site-packages"

USER_BASE = "D:\Python"

在window命令行中python -m site命令查看pip默认安装位置

C:\Users\Administrator>python -m site

sys.path = [

    'C:\\Users\\Administrator',

    'D:\\ProgramFile\\python-3.6.6-amd64\\python36.zip',

    'D:\\ProgramFile\\python-3.6.6-amd64\\DLLs',

    'D:\\ProgramFile\\python-3.6.6-amd64\\lib',

    'D:\\ProgramFile\\python-3.6.6-amd64',

    'D:\\ProgramFile\\python-3.6.6-amd64\\lib\\site-packages',

]

USER_BASE: 'C:\\Users\\Administrator\\AppData\\Roaming\\Python' (exists)

USER_SITE: 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python36\\site-packages' (doesn't exist)

ENABLE_USER_SITE: True

修改site.py文件中的USER_SITE、USER_BASE的值,就可以修改pip命令的默认安装位置

python -m site -help命令

C:\Users\Administrator>python -m site -help

D:\ProgramFile\python-3.6.6-amd64\lib\site.py [--user-base] [--user-site]

 

Without arguments print some useful information

With arguments print the value of USER_BASE and/or USER_SITE separated

by ';'.

 

Exit codes with --user-base or --user-site:

  0 - user site directory is enabled

  1 - user site directory is disabled by user

  2 - uses site directory is disabled by super user

      or for security reasons

 >2 - unknown error

import路径问题

1.sys.path提供了搜索路径

如果 import sys

使用 sys.path 是可以看到有一些目录的

python按照这个目录顺序进行搜索。

2.文件的__name__提供了模块名字

每一个Python对象有这个__name__属性

如果当前的python为执行文件,此处简称为驱动文件,那么__name__的值就是__main__

可以理解为main函数

如果当前python不是执行文件,只是我们组织模块用的,那么__name__就是该文件的相对路径

3.python文件的定位就是 sys.path 和 __name__指定的路径的拼接

 

import找包的路径为

['D:\\PyFile\\torch_test',

 'D:\\PyFile\\torch_test',

'D:\\PyFile\\torch_test\\venv\\Scripts\\python36.zip',

'D:\\ProgramFile\\python-3.6.6-amd64\\DLLs',

'D:\\ProgramFile\\python-3.6.6-amd64\\lib',

'D:\\ProgramFile\\python-3.6.6-amd64',

'D:\\PyFile\\torch_test\\venv',

'D:\\PyFile\\torch_test\\venv\\lib\\site-packages']

然而sys.path是可以添加路径的

print(sys.path)

sys.path.append("D:\Python\python3.6.6\site-packages")

print(sys.path)

 

['D:\\PyFile\\torch_test',

 'D:\\PyFile\\torch_test',

'D:\\PyFile\\torch_test\\venv\\Scripts\\python36.zip',

 'D:\\ProgramFile\\python-3.6.6-amd64\\DLLs',

'D:\\ProgramFile\\python-3.6.6-amd64\\lib',

 'D:\\ProgramFile\\python-3.6.6-amd64',

'D:\\PyFile\\torch_test\\venv',

'D:\\PyFile\\torch_test\\venv\\lib\\site-packages',

 'D:\\Python\\python3.6.6\\site-packages']

注意:默认的path中有'D:\\ProgramFile\\python-3.6.6-amd64\\lib'

而pip安装经常安装在

PS D:\PyFile\torch_test> pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple

Requirement already satisfied: numpy in d:\programfile\python-3.6.6-amd64\lib\site-packages (1.19.5)

 因此,可以将site-packages目录下的相关包向上移动一层文件夹,到lib文件夹中,然后import就可以找到了

sys.path是一个列表,存放的是python搜索模块时可以搜索的路径,启动python脚本时,会将执行当前命令所在的目录添加到这个列表中,而且是在列表的最前面,正是因为这个操作,你才能在自己的项目里引用自己编写的模块,当模块名称与第三方模块或系统模块冲突时,优先引用项目里的模块。

如何永久修改解释器的默认搜索路径?

打印sys.path查看默认路径

在任意默认搜索路径(目录)下创建xxx.pth文件,并在新建文件中写入要添加进sys.path中的路径

完成上诉操作,解释器就会永久修改默认搜索路径。可以在新添加的路径中自定义一些模块,以便在程序中引入。

 

pip指定安装路径

pip install指定安装目录

可以通过 pip install --target=path_name package_name命令,便可以将package_name安装到path_name处

查看pip install 安装的某个包的路径

有时直接在终端使用了pip install package-name命令,无脑操作安装了某一个包,却不知道具体安装在了哪里,那么如何进行寻找具体的安装路径呢?

可以使用pip uninstall package-name命令,此时终端会报出该包的安装路径,并问是否确认卸载,选择不卸载即可。

ENABLE_USER_SITE:   用来表示是否启用用户下的module lib搜索路径,也就是当 ENABLE_USER_SITE=True 时,并且C:\\Users\\81283\\AppData\\Roaming\\Python\\Python38\\site-packages  路径存在,此时sys.path中是有用户module lib搜索路径:C:\\Users\\81283\\AppData\\Roaming\\Python\\Python38\\site-packages的。

 

如果ENABLE_USER_SITE=False 或者 用户module lib搜索路径不存在,此时sys.path中是不出现 C:\\Users\\81283\\AppData\\Roaming\\Python\\Python38\\site-packages的。

 

pip 安装包的时候加上参数--user 包就会自动安装到上面的自定义路径下面

 

python -m pip install pip安装pip

python -m pip install --upgrade pip升级pip

pip freeze >requirements.txt 将所有依赖包写入文件

pip -r install requirements.txt 安装文件中的所有包

pip -r uninstall requirements.txt -y卸载文件中所有包

pip list列出已安装的包

pip show pycurl输出pycurl包的信息

pip list --outdated #列出所有过期的库

pip install --upgrade jieba升级包

pip list --outdated --format=columns查看可更新包

 

pip install pip-review安装批量更新命令

pip -review --local --interactive依次更新所有包

install安装包无参数, 直接从pypi中查找下载

-t 安装到指定位置 -e 安装可编辑的包 -r 通过read文件中的所有包进行安装

download下载包 把指定的包的二进制文件下载到指定位置

pip download jieba -d dir目录

check检查某个包的依赖是否合适

search在pypi里搜索相关包

wheel打包成二进制文件

pip -V查看pip版本

pip list -o查看可升级的包

指定安装版本(默认最新版本)

pip install SomePackage              # 最新版本

pip install SomePackage==1.0.4       # 指定版本

pip install 'SomePackage>=1.0.4'     # 最小版本

 

-i 参数指定 pip 源

 

清华大学源 :https://pypi.tuna.tsinghua.edu.cn/simple

阿里云源   :https://mirrors.aliyun.com/pypi/simple/

豆瓣源    :https://pypi.douban.com/simple/

中国科学技术大学 https://pypi.mirrors.ustc.edu.cn/simple/

华中科技大学    https://pypi.hustunique.com/

 

 

 

python中*星号是非常常见的一个运算符,它主要有以下几个功能:

  • 乘法运算符;2、函数形参表示可变参数;3、函数实参代表tuple;4、序列解包为tuple;5、zip解包运算。

1、乘法运算符

在Python中,*表示乘法,**表示次方,这个不必多说。

2、形参

*在python中做函数形参,可以表示一个可变长度的序列,不过是tuple类型,而**也可以做形参,而且是dict类型,他俩可以同时作为函数形参(也可以只有一个),不过若含有他俩的话得把*放在前面,而**在后。

def f(*a, **b): pass

f(1,2,3, Name='xx', age='yy')

# a = (1,2,3) # b = {'Name': xx, 'age': yy}

3、实参

作为实参的话,*相当于对tuple的解构,同样的**则是对dict的解构

a = (1,2,3) def f(b,c,d): pass f(*a) # b = 1, c = 2, d = 3

4、序列解包运算

也就是把一段不定长数据转换成list,注意这里不是tuple了,而是List

a, b, *c = 1,2,3,4 # a = 1 # b = 2 # c = [3,4]

5zip解包运算

a = [1, 2, 3] b = [4, 5, 6] c = zip(a, b) list(c) # [(1, 4), (2, 5), (3, 6)] d, e = zip(*c) d # (1, 2, 3) e # (4, 5, 6)

其他:

如果在其他地方看见了没见过的*作为函数的参数,也不用惊慌,一般而言,要么是作为不定长参数,要么就是对原功能的结构。

def f(*a,**b):

    print(a)

    print(b)

f(1,2,3,name='Tom',sex='male')

# (1, 2, 3)

# {'name': 'Tom', 'sex': 'male'}

 

f('hello','world',1,2,3,one=1,two=2,three=3)

# ('hello', 'world', 1, 2, 3)

# {'one': 1, 'two': 2, 'three': 3}

Python获取变量占用的内存大小

记录一下,查看python运行当前范围内的变量、方法和定义的类型 会占用多少memory

借助内置模块 sys的 getsizeof即可。

看到该函数的介绍,返回字对象的字节大小。

科班出身的码畜一直被灌输一条上帝圣经:“一个int占4个字节,一个char占1个字节,一个float占4个字节。。。”,

今天看下了python的getsizeof函数,发现python中各个基本数据类型(对象)占用的内存大小和c++/Java完全不一样~

前提概述:python中一切都是对象,so python中其实根本不存在int float这些类型,int其实是一个python对象。

int:28float:24string:54list():64{}:288ste():224

此外,

(1)sys.getsizeof只计算实际使用的内存大小,引用所消耗的内存大小不计算。

(2)sys.getsizeof只能作为计算内存大小的参考~

这里有一个问题,为什么python各个数据类型占用大小和c++中不一致呢?

这里本质上是由python的实现所决定的,python代码在运行的时候会由python解析器执行,具体会解析为C语言的某种结构。也就是说,python中的一个int(或其他)映射到c语言中会是一种复杂结构体。

以python的int为例说明,下面是python的int在C中的具体形式:

typedef struct {

    PyObject_HEAD

    long ob_ival;

} PyIntObject;

struct _longobject {

    long ob_refcnt;  // 引用计数

    PyTypeObject *ob_type; //变量类型

    size_t ob_size;  //实际占用内容大小

    long ob_digit[1];  //存储的实际python值

};

发现没有,python实际的值只是相应C结构中的一个属性,难怪python的int占28个字节,而C语言只需要4个字节,因为python还存储了很多相关的其他信息!其他信息是实际数值的6倍大小!

sys.getsizeof()

int:28float:24string:54list():64{}:288ste():224

获取对象所占内存大小,

与C++不同,仅供参考

id()

获取对象所在内存首地址

type()

获取对象类型

hasattr和getattr

class Stu():
    def __init__(self, name, age, sex):
        self.name = name,
        self.age = age,
        self.sex = sex


s = Stu('Jack', 22, 'male')
print(hasattr(s, 'name'))  # 判定某个对象是否包含某个名称的属性
print(getattr(s, 'age'))  # 通过属性名称获取属性的值
print(getattr(s, 'score'))
# AttributeError: 'Stu' object has no attribute 'score'

类型建议符: ->

def twoSum(a: int, b: int=1) -> int:

函数参数中的冒号是参数的类型建议符,即希望传入的实参类型。函数后面跟着的箭头是函数返回值的类型建议符,用来说明该函数返回的值是什么类型。

**类型建议符并非强制规定和检查,也就是说即使传入的实际参数与建议参数不符,也不会报错

有了说明符,可以方便程序员理解函数的输入与输出(具体涉及到的工作,比如静态分析与代码重构)。

————————————————

python中冒号:的作用

一开始接触python代码的时候冒号这个存在一直困扰了我很久,说一下我对冒号的理解。

冒号(:)表示的就是一个整体,冒号出现在哪里就代表这个位置对整体。

第一:作为整体用于输出/取某个维度上的所有元素

如在plt.scatter(x[:, 0], x[:, 1])这行代码中,:在原来行的位置,代表行的这一系列元素的整体。如:

x = np.array([[1,2,3],[4,5,6]])

print(x[0,:])

print(x[:,0])

输出:

[1 2 3]

[1 4]

可见,x[0,:]代表的是x在第0行的所有列上的元素,x[:,0]表示x在所有行上第0列的元素。

同理:print(a[:])等价于print(a),a[n]就表示a中的第n个元素,用:代替n就是取所有元素的意思。

第二,作为整体参与运算 如:

a = np.arange(0,9)

print(a[:-1])

输出: [0 1 2 3 4 5 6 7]

就是在原来a=[0 1 2 3 4 5 6 7 8]之上砍掉了最后一个元素,即第-1个元素。冒号在其中第作用就是将a中的所有元素作为一个整体,一个整体被-1就是砍掉最后一个元素。

:-n即砍掉最后n个元素

若print(a[:1]),则输出[0]。相当于取:代替整体中的第一个元素。

 

第三,双冒号::

a = np.arange(0,9)

print(a[::2])

输出:

[0 1 2 3 4 5 6 7 8]

[0 2 4 6 8]

a[::2]将a中的元素两个两个分组并取每组中第一个出来,也可以理解为每2个数中取一个。

a[::3]将a中的元素三个三个分组并取每组中第一个出来

a = np.arange(0,9)

print(a[::-1])

输出:[8 7 6 5 4 3 2 1 0]即将a中的元素倒序。

同理,a[::-2]即将a中元素倒序后两个两个分组并取每组中第一个。

————————————————

 

def get_buffer(self, target: str) -> "Tensor":

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

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

这里面,元数据表明了函数的返回值为int类型。

这样做的好处:使用预期的类型来注释参数,然后在函数返回值验证时检验参数的类型或者将其强制转换成预期的类型。

fn

列表运算 split_tokens.extend(self._run_split_on_punc(token))

extend() 函数、append()函数、+ 与 += 功能比较:

append()是向列表尾部追加一个新元素,列表只占一个索引位,在原有列表上增加。

extend()向列表尾部追加一个列表,将列表中的每个元素都追加进来,在原有列表上增加。

+与extend()在效果上具有相同的功能,但是实际上生成了一个新的列表来存放这两个列表的和,只能用在两个列表相加上。

+=与extend()效果一样。

 

s='Return a list of the words in the string, using sep as the delimiter string.'

tokens=s.split()

print(tokens)

#['Return', 'a', 'list', 'of', 'the', 'words', 'in', 'the', 'string,', 'using', 'sep', 'as', 'the', 'delimiter', 'string.']

              Return a list of the words in the string, using sep as the delimiter string.

        将字符串分隔成字符列表,并返回

          sep 分隔符

            The delimiter according which to split the string.

如果不指定,则任意的空白字符都作为分隔符,

分割出来的子串中的空字符串,将被丢弃

            None (the default value) means split according to any whitespace,

            and discard empty strings from the result.

          maxsplit

            Maximum number of splits to do. 分割的最大长度,默认-1 表示长度不限

            -1 (the default value) means no limit.

def ord(*args, **kwargs): # real signature unknown

""" Return the Unicode code point for a one-character string. """

将字符转换为Unicode编码的数值,入参是只有一个字符的字符串

 

def _is_control(char): 是否是控制字符

  """Checks whether `chars` is a control character."""

  # These are technically control characters but we count them as whitespace

  # characters.

"\t" "\n" "\r"都不是控制字符,

  if char == "\t" or char == "\n" or char == "\r":

    return False

  cat = unicodedata.category(char)

  if cat in ("Cc", "Cf"):

    return True

  return False

cat = unicodedata.category(char)

def category(*args, **kwargs): # real signature unknown

    """ Returns the general category assigned to the character chr as string. """

    pass

unicodedata.category(chr)

把一个字符返回它在UNICODE里分类的类型。具体类型如下:

Code Description

[Cc] Other, Control

[Cf] Other, Format

在Unicode中,某些字符能够用多个合法的编码表示。

unicodedata.normalize ——Unicode文本标准化

在处理Unicode字符串,需要确保所有字符串在底层有相同的表示。

在需要比较字符串的程序中使用字符的多种表示会产生问题。

normalize() 第一个参数指定字符串标准化的方式。 NFC表示字符应该是整体组成(比如可能的话就使用单一编码),而NFD表示字符应该分解为多个组合字符表示。

Python同样支持扩展的标准化形式NFKC和NFKD,它们在处理某些字符的时候增加了额外的兼容特性。

 

 

# t=[1]*10

# print(t)

# #[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

a=[1,2,3,4,5]

a.pop()

print(a) # [1, 2, 3, 4]

 

guid = "%s-%s" % ('set_type', 1999)

print(guid) #set_type-1999

s='    hello world    '

print(s) #'    hello world    '

# Return a copy of the string S with leading and trailing

#         whitespace removed.

s=s.strip() #去掉开头和尾部的所有空格

print(s)  #'hello world'

 

 

生词本

 

punctuation

英 [ˌpʌŋktʃuˈeɪʃn]  美 [ˌpʌŋktʃuˈeɪʃ(ə)n]

n. 标点符号,

class BasicTokenizer(object):

  """Runs basic tokenization (punctuation splitting, lower casing, etc.)."""

 

lingual

英 [ˈlɪŋɡwəl]  美 [ˈlɪŋɡwəl]

adj. 语言的;舌的,舌音的

n. 舌音,舌音字

multilingual.md

There are two multilingual(多语言的) models currently available. We do not plan to release more single-language models, but we may release BERT-Large versions of these two in the future:

truncate

英 [trʌŋˈkeɪt]  美 [ˈtrʌŋkeɪt]

v. 截断,删节;把……截成平面

 _truncate_seq_pair(tokens_a, tokens_b, max_seq_length - 3) 截断

 

 

token英 [ˈtəʊkən]  美 [ˈtoʊkən]

n. 代币,专用辅币;象征,标志;礼券,代金券;(语言学)符号;(计算机)令牌,记号;令牌 标记 支付标记

They regard gifts as a token of friendship.

他们把礼物当作友谊的象征。

In such a case, you must send a token.

在这种情况下,必须发送一个标志。

All requests need to pass a valid access token.

所有的请求都需要带有有效的访问令牌。

 

tokenizer  n. 分词器;编译器

 

 tokens_a = tokenizer.tokenize(example.text_a) 将文本转换为符号

  tokens_b = None    b默认设置为空,适用于一句话的情况

  if example.text_b:  如果句子b非空,就把句子b转换为符号

    tokens_b = tokenizer.tokenize(example.text_b)

pad英 [pæd]  美 [pæd]

v.(添加不必要的信息以)拉长(pad sth. out); (用软物)填塞,垫衬;

 

When running eval/predict on the TPU, we need to pad the number of examples  to be a multiple of the batch size, because the TPU requires a fixed batch  size.

需要将例子个数拉长,拉长的方式就是填充一些无用的东西,拉长的长度就是拉长到批处理量的整数倍,以便进行一批批的处理;

delimiter英 [dɪˈlɪmɪtə(r)]  美 [dɪˈlɪmɪtər]n. [计] 定界符  分隔符 限定器

 

 reader = csv.reader(f, delimiter="\t", quotechar=quotechar)

读取csv或者tsv文件,以"\t"作为分隔符

evaluation英 [ɪˌvæljuˈeɪʃn]  美 [ɪˌvæljuˈeɪʃ(ə)n]n. 评价,评估

 

flags.DEFINE_bool("do_eval", False, "Whether to run eval on the dev set.") 是否进行验证 eval=evaluation

evaluate英 [ɪˈvæljueɪt]  美 [ɪˈvæljueɪt]v. 评价,评估,估值;

scalar英 [ˈskeɪlə(r)]  美 [ˈskeɪlər]n. [数] 标量;[数] 数量

 

 # Scalar dimensions referenced here: 标量维度

  #   B = batch size (number of sequences)  B批处理量

  #   F = `from_tensor` sequence length  F输入张量的序列长度

  #   T = `to_tensor` sequence length   T输出张量的序列长度

  #   N = `num_attention_heads`     N注意力头数

  #   H = `size_per_head`    H每个头的大小

residual英 [rɪˈzɪdjuəl]  美 [rɪˈzɪdʒuəl]n. (数量)剩余;残差;

 

Transformer 需要对残差进行求和计算,所以 所需的参数和隐藏层相同

  # The Transformer performs sum residuals on all layers so the input needs

  # to be the same as the hidden size.

concatenate英 [kɒnˈkætɪˌneɪt]  美 [kənˈkæt(ə)nˌeɪt]v. 连接,连结,使连锁

 

else:  如果有好多头

         有多头的情况下,我们将他们连接起来,然后再投影;

          # In the case where we have other sequences, we just concatenate

          # them to the self-attention head before the projection.

          attention_output = tf.concat(attention_heads, axis=-1)

 

unicodedata.category(chr)

把一个字符返回它在UNICODE里分类的类型。具体类型如下:

Code Description

[Cc] Other, Control

[Cf] Other, Format

[Cn] Other, Not Assigned (no characters in the file have this property)

[Co] Other, Private Use

[Cs] Other, Surrogate

[LC] Letter, Cased

[Ll] Letter, Lowercase

[Lm] Letter, Modifier

[Lo] Letter, Other

[Lt] Letter, Titlecase

[Lu] Letter, Uppercase

[Mc] Mark, Spacing Combining

[Me] Mark, Enclosing

[Mn] Mark, Nonspacing

[Nd] Number, Decimal Digit

[Nl] Number, Letter

[No] Number, Other

[Pc] Punctuation, Connector

[Pd] Punctuation, Dash

[Pe] Punctuation, Close

[Pf] Punctuation, Final quote (may behave like Ps or Pe depending on usage)

[Pi] Punctuation, Initial quote (may behave like Ps or Pe depending on usage)

[Po] Punctuation, Other

[Ps] Punctuation, Open

[Sc] Symbol, Currency

[Sk] Symbol, Modifier

[Sm] Symbol, Math

[So] Symbol, Other

[Zl] Separator, Line

[Zp] Separator, Paragraph

[Zs] Separator, Space

 

 

Python的访问权限控制

权限

举例

单下划线(左)_a

保护权限protect

def _is_whitespace(char)

双下划线(左)_ _a

私有权限private

class __method(object):

无下划线(左)a

公开权限public

def tokenize(self, text):

双下划线(左右)_ _a_ _

系统定义sys

def __init__(self)

函数

访问权限

Python的访问权限控制

权限

举例

单下划线(左)_a

保护权限protect

def _is_whitespace(char)

双下划线(左)_ _a

私有权限private

class __method(object):

无下划线(左)a

公开权限public

def tokenize(self, text):

双下划线(左右)_ _a_ _

系统定义sys

def __init__(self)

列表切片总结

[m : ] 代表列表中的第m+1项到最后一项

[ : n] 代表列表中的第一项到第n项

[-1] 代表获取到最后一项(-1就是倒数第一项)

[:-1]代表除了最后一个都获取到

[::-1]代表逆序取,从后向前取

[2::-1]代表从下标从0到2的三个数,逆序取

[1:]代表从下标为1开始取到最后一个数

 

Python中的True和False

path=os.path.join('a','b')
print(path) #a\b
messages=[]

if messages==False:
    print('[]就是False')
messages=None
if messages==False:
    print('None是False')
messages=''
if messages==False:
    print('\'\'是False')
messages = ()
if messages==False:
    print('()是False')
messages = {}
if messages==False:
    print('{}是False')

 

空集合就是False,None也是False

空集合包括:空字典{}、空元组()、空列表[]、空字符串''  ""

 

posted on 2022-11-19 17:36  张德长  阅读(316)  评论(0编辑  收藏  举报