2021-02-24 17:02:41    1102    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    1124    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    923    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    1121    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    1120    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    1630    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    1296    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:"%
? gitlab ?    2021-01-06 15:19:23    1067    0    0
  1. gitlab web : User Setting --> Access Tokens

API_VERSION:

  1. https://gitlab.casa-systems.com/help/api/v3_to_v4.md
  2. In GitLab 9.0 and later, API V4 is the preferred version to be used.

jq command:

  1. https://stedolan.github.io/jq/manual/#Invokingjq



gitlab api 根据指定组名取组对象

  1. curl --header "PRIVATE-TOKEN: $P_token" $GITLAB_INSTANCE/api/$API_VERSION/groups/${GroupName} 2>/dev/null|jq .

gitlab api 根据指定组名取组里的元素属性

  1. curl --header "PRIVATE-TOKEN: $P_token" $GITLAB_INSTANCE/api/$API_VERSION/groups/${GroupName} 2>/dev/null|jq 'keys'

gitlab api 根据指定组名取组里的第一个project里的属性

  1. curl --header "PRIVATE-TOKEN: $P_token" $GITLAB_INSTANCE/api/$API_VERSION/groups/${GroupName} 2>/dev/null|jq .projects[0]|jq 'keys'

gitlab api 根据指定组名取组的任一key的值

  1. curl --header "PRIVATE-TOKEN: $P_token" $GITLAB_INSTANCE/api/$API_VERSION/groups/${GroupName
2020-11-23 14:23:08    768    0    0

工具 winscp

windows 7 , WinSCP-5.9.3-Portable

  1. winscp> help
  2. call Executes arbitrary remote command
  3. cd Changes remote working directory
  4. checksum Calculates checksum of remote file
  5. chmod Changes permissions of remote file
  6. close Closes session
  7. echo Displays its arguments as message
  8. exit Closes all sessions and terminates the program
  9. get Downloads file from remote directory to local directory
  10. help Displays help
  11. keepuptodate Continuously reflects changes in local directory on remote one
  12. lcd Changes local working directory
  13. lls Lists the contents of local directory
  14. ln Creates remote symbolic link
  15. lpwd Prints local working directory
  16. ls Lists the contents of remote directory
  17. mkdir Creates remote directory
  18. mv Moves or renames remote file
  19. open Connects to server
  20. option Sets or shows value of script options
  21. put Uploads file
2020-10-29 15:52:37    596    0    0

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

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