Category - Linux

2021-03-10 17:11:30    1243    0    0

使用模块

模块是为了用来下定义和重用的。
导入放在c:/python 下的hello.py 作为模块使用。模块导入只导入一次,第二次什么也不会发生,打破互相导入的死循环。如果一定要重新加载模块,使用importlib.reload()

  1. >>> import sys
  2. >>> sys.path.append('C:/python')
  3. >>> import hello
  4. Hello, world!

查看系统查找的全部路径有什么,除了sys.path , 标准做法是将模块所在的目录包含在环境变量PYTHONPATH中。

  1. >>> import sys, pprint
  2. >>> pprint.pprint(sys.path)
  3. ['C:\\Python35\\Lib\\idlelib',
  4. 'C:\\Python35',
  5. 'C:\\Python35\\DLLs',
  6. 'C:\\Python35\\lib',
  7. 'C:\\Python35\\lib\\plat-win',
  8. 'C:\\Python35\\lib\\lib-tk',
  9. 'C:\\Python35\\lib\\site-packages']

包含测试代码的模块,应该将代码放入if 条件中

  1. if __name__ == '__main__': test()

使用包

模块存储在扩展名为.py的文件中,而包则是一个目录。要被Python视为包,目录必须包含文件init.py。如果像普通模块一样导入包,文件init.py的内容就将是包的内容。

模块包含什么

dir

要查明模块包含哪些东西,可使用函数dir,它列出对象的所有属性(对于模块,它列出所有的函数、类、变量等)。

  1. [i for i in dir(copy) if not i.startswith("_")]
  2. ['Error', 'copy', 'deepcopy', 'dispatch_table', 'error']

all

  1. >>> copy.__all__
  2. ['Error', 'copy', 'deepcopy']

all 的设置是在模块copy 是定义的

__all__ =

? python ?    2021-03-10 17:07:35    1261    0    0

文档字符串

除了# 注释,有另一种编写注释的方式,就是添加独立的字符串。在有些地方,如def语句后面(以及模块和类的开头,),添加这样的字符串很有用。放在函数开头的字符串称为文档字符串(docstring),将作为函数的一部分存储起来。下面的代码演示了如何给函数添加文档字符串:

  1. def square(x):
  2. 'Calculates the square of the number x.'
  3. return x * x

可以像下面这样访问文档字符串:

  1. >>> square.__doc__
  2. 'Calculates the square of the number x.'

收集参数

单星号 * (元组)
前面有星号的参数将被放在元组中。
因此星号意味着收集余下的位置参数。如果没有可供收集的参数,params将是一个空元组。

  1. >>> print_params_2('Nothing:')
  2. Nothing:
  3. ()

与赋值时一样,带星号的参数也可放在其他位置(而不是最后),但不同的是,在这种情况下你需要做些额外的工作:使用名称来指定后续参数。单星号不会收集关键字参数。

  1. >>> def in_the_middle(x, *y, z):
  2. ... print(x, y, z)
  3. ...
  4. >>> in_the_middle(1, 2, 3, 4, 5, z=7)
  5. 1 (2, 3, 4, 5) 7

双星号 ** (字典)
要收集关键字参数,可使用两个星号。

  1. >>> def print_params_3(**params):
  2. ... print(params)
  3. ...
  4. >>> print_params_3(x=1, y=2, z=3)
  5. {'z': 3, 'x': 1, 'y': 2}

如你所见,这样得到的是一个字典而不是元组。可结合使用这些技术。

  1. def print_params_4(x, y, z=3, *pospar, **keypar):
  2. print(x, y, z)
  3. print(pospar)
  4. print(keypar)

其效果与预期的相同。

  1. >>> print_params_4(1
2021-02-24 17:02:41    1093    0    0

字符串(以及数和元组)是不可变的(immutable),这意味着你不能修改它们(即只能替换为新值)。因此这些类型作为参数没什么可说的,不会影响 外部原来的值。但如果参数为可变的数据结构(如列表)呢?

  1. >>> def change(n):
  2. ... n[0] = 'Mr. Gumby'
  3. >>> names = ['Mrs. Entity', 'Mrs. Thing']
  4. >>> change(names)
  5. >>> names
  6. ['Mr. Gumby', 'Mrs. Thing']

在这个示例中,修改了变量关联到的列表。下面再这样做一次,但这次不使用函数调用。

  1. >>> names = ['Mrs. Entity', 'Mrs. Thing']
  2. >>> n = names # 再次假装传递名字作为参数
  3. >>> n[0] = 'Mr. Gumby' # 修改列表
  4. >>> names
  5. ['Mr. Gumby', 'Mrs. Thing']

将同一个列表赋给两个变量时,这两个变量将同时指向这个列表。就这么简单。要避免这样的结果,必须创建列表的副本。对序列执行切片操作时,返回的切片都是副本。因此,如果你创建覆盖整个列表的切片,得到的将是列表的副本。

  1. >>> names = ['Mrs. Entity', 'Mrs. Thing']
  2. >>> n = names[:]
  3. 现在nnames包含两个相等但不同的列表。
  4. >>> n is names
  5. False
  6. >>> n == names
  7. True
  8. 现在如果(像在函数change中那样)修改n,将不会影响names
  9. >>> n[0] = 'Mr. Gumby'
  10. >>> n
  11. ['Mr. Gumby', 'Mrs. Thing']
  12. >>> names
  13. ['Mrs. Entity', 'Mrs. Thing']
  14. 下面来尝试结合使用这种技巧和函数change
  15. >>> change(names[:])
  16. >>> names
  17. ['Mrs. Entity', 'Mrs. Thing']

注意到参数n包含的是副本,因此原始列表是安全的。

? python ?    2021-02-24 14:55:56    1106    0    0

append

方法append用于将一个对象附加到列表末尾。

  1. >>> lst = [1, 2, 3]
  2. >>> lst.append(4)
  3. >>> lst
  4. [1, 2, 3, 4]

append也就地修改列表。这意味着它不会返回修
改后的新列表,而是直接修改旧列表。

  1. # l 指向letterGirls['a'] , 然后 l 后面附加一串‘cc’ , letterGirls['a']的值也被修改,两者指向同一个列表,即原件相同,关联同一个列表
  2. >>> l = letterGirls.setdefault('a', [])
  3. >>> l
  4. ['alice', 'alice', 'aly', 'aa', 'bb']
  5. >>> l.append('cc')
  6. >>> l
  7. ['alice', 'alice', 'aly', 'aa', 'bb', 'cc']
  8. >>> letterGirls
  9. {'a': ['alice', 'alice', 'aly', 'aa', 'bb', 'cc'], 'b': ['bernice', 'bernice'], 'c': ['clarice', 'clarice']}
  10. # 同理,引用同一个列表,其删作一个元素,另一个也修改
  11. >>> b = l
  12. >>> b
  13. ['alice', 'alice', 'aly', 'aa', 'bb', 'cc']
  14. >>> del(b[3])
  15. >>> l
  16. ['alice', 'alice', 'aly', 'bb', 'cc']
  17. >>> b
  18. ['alice', 'alice', 'aly', 'bb', 'cc']

setdefault

方法setdefault有点像get,因为它也获取与指定键相关联的值,但除此之外,setdefault
还在字典不包含指定的键时,在字典中添加指定的键-值对。

  1. >>> d = {}
  2. >>> d.setdefault('name', 'N/A')
  3. 'N/A'
  4. >>> d
  5. {'name': 'N/A'}
  6. >>> d['name'] = 'Gumby'
  7. >>> d.setdefault('name', 'N/A')
  8. 'Gumby'
  9. >>> d
  10. {'name': 'Gumby'}
  11. # 如你所
2021-02-24 10:03:18    919    0    0

推导并不是语句,而是表达式。它们看起来很像循环,通过列表推导,可从既有列表创建出新列表,这是通过对列表元素调用函数、剔除不想要的函数等实现的。推导功能强大,但在很多情况下,使用普通循环和条件语句也可完成任务,且代码的可读性可能更高。使用类似于列表推导的表达式可创建出字典。

列表推导:

括号 []

单个for

  1. >>> [x * x for x in range(10)]
  2. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

多个for

  1. >>> [(x, y) for x in range(3) for y in range(3)]
  2. [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

for + if

  1. >>> girls = ['alice', 'bernice', 'clarice']
  2. >>> boys = ['chris', 'arnold', 'bob']
  3. >>> [b+'+'+g for b in boys for g in girls if b[0] == g[0]]
  4. ['chris+clarice', 'arnold+alice', 'bob+bernice']

字典推导:

花括号 { }

  1. >>> squares = {i:"{} squared is {}".format(i, i**2) for i in range(10)}
  2. >>> squares[8]
  3. '8 squared is 64'

在列表推导中,for前面只有一个表达式,而在字典推导中,for前面有两个用冒号分隔的表
达式。这两个表达式分别为键及其对应的值。

生成器推导:

圆括号 ( )
生成器推导(也叫生成器表达式)。其工作原理与列表推导相同,但不是创建一个列表(即不立即执行循环),而是返回一个生成器,让你能够逐步执行计算。

  1. sum(i ** 2 for i in range(10))
2021-02-20 12:17:21    1114    0    0

python 中随机数

模块random中一些重要的函数

函 数 描 述
random() 返回一个0~1(含)的随机实数
getrandbits(n) 以长整数方式返回n个随机的二进制位
uniform(a, b) 返回一个a~b(含)的随机实数
randrange([start], stop, [step]) 从range(start, stop, step)中随机地选择一个数
choice(seq) 从序列seq中随机地选择一个元素
shuffle(seq[, random]) 就地打乱序列seq
sample(seq, n) 从序列seq中随机地选择n个值不同的元素

这里使用sample的一个例子

  1. from random import sample
  2. print('MY RED : {}'.format(sample(list(range(1,34,1)), 6)))
  3. print('MY BLUE : {}'.format(sample(list(range(1,17,1)), 1)))
  1. (venv) C:\Users\LTE-LCFeng\PycharmProjects\ssq\venv>python ssq.py
  2. MY RED : [9, 1, 24, 26, 3, 6]
  3. MY BLUE : [6]

Shell 中随机数

shell的RANDOM函数

范围 0~32767

  1. echo $RANDOM

取小范围内随机数,对随机结果取模N , 可取到0~(N-)1 内的随机数
取1~ 6 的随机数,只需加1

  1. echo $[$RANDOM%6+1]

一个范例

在1-33 中取6个不重复的随机数,在1-16中取1随机数

  1. #!/bin/bash
  2. RED_D=33
  3. BLUE_D=16
  4. RED_MAX=6
  5. count=0
  6. touch RED.txt
  7. while [ $count -lt ${RED_MAX} ]
  8. do
  9. flag=$(expr 6 - $count)
  10. while [ $flag -gt 0 ]
  11. do
  12. flag=$(expr $flag - 1)
  13. RED=$[$RANDOM%
2021-02-19 10:23:09    1113    0    0

相关命令:
执行并放置后台执行 : command &
将后台程序拉回屏幕输出: fg
将当前屏幕执行程序再丢到后台执行:Ctrl Z

执行程序并丢到后台执行 &

  1. [lcf@nut ~]$ acgui&
  2. [1] 14087

把当前后台执行的程序拉回当前屏幕执行 fg

  1. [lcf@nut ~]$ fg
  2. acgui

把已经在当前屏幕执行中的程序丢到后台继续执行 Ctrl Z

  1. [lcf@nut ~]$ fg
  2. acgui
  3. ^Z
  4. [1]+ Stopped acgui
? shell ? ? python ?    2021-01-22 16:17:53    1614    0    0

Shell seq用法

seq --help

  1. Usage: seq [OPTION]... LAST
  2. or: seq [OPTION]... FIRST LAST
  3. or: seq [OPTION]... FIRST INCREMENT LAST
  4. Print numbers from FIRST to LAST, in steps of INCREMENT.
  5. Mandatory arguments to long options are mandatory for short options too.
  6. -f, --format=FORMAT use printf style floating-point FORMAT
  7. -s, --separator=STRING use STRING to separate numbers (default: \n)
  8. -w, --equal-width equalize width by padding with leading zeroes
  9. --help display this help and exit
  10. --version output version information and exit

注意事项

seq 选项[-s " "][-w] FIRST INCREMENT LAST
注意 选项紧跟seq, 位于序列数字FIRST INCREMENT LAST之前,FIRST INCREMENT LAST放在最后
比如

  1. seq -s " " -w 2 100 1000

常用命令

  • 生成一个1 到 10 的序列 ,不指定分隔符s时,默认是换行符。
  1. root@gua-vm1:/vob# seq 10
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  • 生成一个1 到 10 的序列 ,指定分隔符为空格 ,在seq 后面加上选项 -s " "
  1. root@gua-vm1:/vob# seq -s " " 10
  2. 1 2 3 4 5 6 7 8 9 10
  • 生成一个3 到 10 的序列 ,只指定头尾时,默认递增量为1
  1. r
? shell ?    2021-01-20 17:03:25    1276    0    0

打印全部列

  1. awk '{print $0}'

打印指定列

  1. awk '{print $2,$4}'

打印指定列并拼接字符串

  1. awk '{print $1,"hhah",$2}'
  2. awk '{print $1"hahah"$2}'

按指定分隔符取列

  1. awk -F: '{ print $1 }'

打印某一列及后面所有列的内容

  1. awk '{out=""; for(i=2;i<=NF;i++){out=out" "$i}; print out}'

打印最后一列,最后一列的前一列,NF表示最后一列的列号

  1. awk '{print $NF, $(NF-1)}'

打印指定一行,NR表示行号

  1. awk 'NR==6 {print $0}'

打印第六行,以 :分隔开的第一列

  1. awk -F ":" 'NR==6 {print $1}'

打印第4行以后的行

  1. git log --pretty=format:"%H-%h:%h" -n 15 |cat -n | awk 'NR>4 {print $0}'
  2. 5 1f021028e22d92119fa5a0821273596e0c37be87-1f02102:1f02102
  3. 6 f36b0ad5a376edf485979b357af4ac1df87cc443-f36b0ad:f36b0ad
  4. 7 e3776955f8f3592051603d2299b93d3b55cbc52a-e377695:e377695
  5. 8 94c50a1fd810d5c1e62535fac8f6db3c01c4c476-94c50a1:94c50a1
  6. git log --pretty=format:"%H-%h:%h" -n 15 |cat -n | awk 'NR<4 {print $0}'
  7. git log --pretty=format:"%H-%h:%h" -n 15 |cat -n | awk 'NR<=4 {print $0}'

条件用法
打印包含 Merge branch 的行 用/strings/

  1. git log --pretty=format:"%
2020-10-29 15:52:37    588    0    0

p2top3命令批量转化语法之后,还有一些 版本2和3之间用法的差异需要手动调整:

  1. if
  2. browser 抓取值
  3. 下载链接
2/7