Python

Linux

  • ls: 查看目录
  • cd / :表示进入根目录,它是一切目录的父目录
  • cd …:可以回到上一级目录,类似 Windows 的「向上」
  • cd - :表示回到上一次所在的目录,类似 Windows 的「后退」
  • cd ~:表示回到当前用户的主目录,类似 Windows 的「回到桌面」
  • tree :列出一个文件夹下的所有子文件夹和文件(以树形结构来进行列出)
  • pwd :获取当前目录的绝对路径
  • mkdir:创建目录
  • mkdir后加入-p参数,一次性创建多级目录
  • touch :新建文件
  • cp :(Copy)复制文件到指定目录下
  • cp:还可复制目录,eg. cp -r 目录名 目标目录名
  • rm:删除文件
  • mv :移动文件或目录,eg. mv 文件名 目录名
  • mv:还可用来重命名,如mv test1 test2, 会把test1重命名为 test2
  • cat:将文件中的内容打印到屏幕上,使用方法是 cat 文件路径
  • cat -n:带行号地打印文件内容

Python

python3:进入环境(Linux)

快捷键Ctrl+D/输入exit():退出环境(Linux)

\:转义字符 \n:回车

#:注释

‘’’ ‘’':多行注释

菜鸟教程

https://www.runoob.com/python/python-tutorial.html

索引

位置的编号,从0开始计数

索引可以是负数,表示倒数第几个,例如最后一个字符索引为-1

input

输入代码:

age = input('My age is :')

执行代码后,弹出「My age is :」,在后面输入年龄,再按回车,age获得输入的值

format()

format()是专门用来 格式化字符串 的函数,它最常用的功能就是「插入数据」和「数字格式化」

插入数据:

输入姓名和年龄,用 name 和 age 变量接收数据

name = input('请输入姓名:')
age = input('请输入年龄')

打印 “你叫 xxx,今年 x 岁了

第一种:用 + 号串联打印的内容,虽然可行,但是比较麻烦,而且有局限性:

print('你叫'+name+',今年' + age + '岁了')

第二种:用format() 函数,实现插入效果:

print('你叫{},今年{}岁了'.format(name,age))

{} 为占位符,我先把这个位置占住,具体数据在后面导入。

图片描述

数字格式化:

format() 的第二种常用功能,是格式化数字,比如要输出圆周率,但只保留两位小数,可以这么写:

print("{:.2f}".format(3.1415926))

如果要保留三位,则改成 {:.3f};不带小数,则改成 {:.0f},依次类推。

算术运算符

运算符名称描述
+两个对象相加
-得到负数或是一个数减去另一个数
*两个数相乘或是返回一个被重复若干次的字符串
/x 除以 y
%取模返回除法的余数
**返回 x 的 y 次幂
//取整除返回商的整数部分(向下取整)

比较运算符

返回True、False,通常用于程序执行 循环和判断 中:

运算符描述
==等于:比较对象是否相等
!=不等于:比较两个对象是否不相等
>大于:返回 x 是否大于 y
<小于:返回 x 是否小于 y
>=大于等于:返回 x 是否大于等于 y
<=小于等于:返回 x 是否小于等于 y

赋值运算符

主要是为了简写

运算符描述实例
=赋值运算符c = a + b :将 a + b 的运算结果赋值为 c
+=加法赋值运算符c += a :等效于 c = c + a
-=减法赋值运算符c -= a :等效于 c = c - a
*=乘法赋值运算符c *= a :等效于 c = c * a
/=除法赋值运算符c /= a :等效于 c = c / a
%=取模赋值运算符c %= a :等效于 c = c % a
**=幂赋值运算符c **= a :等效于 c = c ** a
//=取整除赋值运算符c //= a :等效于 c = c // a

逻辑运算符

即高中数学中的「 且、或、非 」,Python 中用 andornot 表示这三种逻辑。

运算符逻辑表达式结果
and(逻辑与)a and b当 a、b 都为 True 时,返回 True;否则返回 False
or(逻辑或)a or b当 a、b 任意一个为 True,就返回 True
not(逻辑非)not a当 a 为 True 时,返回 False;反之亦然

if

if 判断条件1: #判断
	if 判断条件2 and 判断条件3: #嵌套判断,同时满足条件2,3
		执行1
	else:
		执行2
elif 判断条件4: #另一个条件,else if
    if 判断条件5 or 判断条件6: #嵌套判断,满足条件5,6中一个
		执行3
	else:
		执行4
else: # 不在提出的if条件内的其他情况
	pass #跳过这个代码块,继续执行后面的代码

循环

for循环

for循环主要用于对一个范围内的每个元素进行指定操作。

语法如下:

图片描述

range() 函数

如果需要处理一组数字列表,并且数字列表满足一定的规律,可以使用 Python 的内置函数 range()(范围)。

range(x)函数:生成一个从 0 到 x-1 的整数序列

range(a,b):取区间[a,b-1]的数

while循环

for 循环 适用于 已知循环次数 的循环,所以后面跟的是次数或区间,到达指定次数就停止。

while 循环 适用于 未知循环次数 的循环,后面跟的是一个条件,只要条件满足,这个循环就会一直进行下去。

具体语法如下:

图片描述

break 表示停止当前循环

continue 表示跳过当前循环轮次,去执行下一轮循环

取整

math.ceil()

向上取整,小数都是向着数值更大的方向取整,不论正负数

import math
math.ceil(-0.5)
>>>0
math.ceil(0.3)
>>>1

round()

四舍五入:

round()当不传入第二个参数时默认取整,具体就是按照四舍五入来。

PS:小数末尾为5时:5前为奇:向绝对值更大取整(如-1.5、1.5);5前为偶:去尾取整(如-2.5,-0.5,0.5,2.5)。

round(-2.5)
>>>-2
round(-1.5)
>>>-2
round(-0.5)
>>>0
round(0.5)
>>>0
round(1.5)
>>>2
round(2.5)
>>>2

math.floor()

简单且忠实地向下取整

math.floor(-0.3)
>>> -1
math.floor(0.9)
>>> 0

int()

向0取整,取整方向总是让结果比小数的绝对值更小

int(-0.5)
>>> 0
int(-0.9)
>>> 0
int(0.5)
>>> 0
int(0.9)
>>> 0

// 向下取整

向下取整,与math.floor()处理结果一样

(-1) // 2  # -0.5
>>> -1
(-3) // 2  # -1.5
>>> -2
1 // 2    # 0.5 
>>> 0
3 // 2    # 1.5
>>> 1

Python获取int最大值和float最大值

int型

import sys
MAX_INT=sys.maxsize
print(MAX_INT)

float型

max_float=float('inf')

最大的浮点数就是这个 inf

排序

list的sort()函数

list.sort(key=None, reverse=Falsee)
  • sort()函数没有返回值
  • key表示排序依据的函数
  • reverse表示需不需要反转列表,默认为False表示升序,True表示降序。

key的设置:

from functools import cmp_to_key
key = None #不使用key
key = lamda x : x * (-1) #匿名函数,lambda :f(x) = -x
key = abs #系统内置函数或自定义函数
key = cmp_to_key(cmp) #通过cmp_to_key函数将传统cmp函数转成key

sorted()

sorted(iterable, *, key=None, reverse=False)
  • sorted()返回值类型为List
  • 参数列表iterable表示可迭代对象
  • *表示位置参数就此终结,后面的参数必须用关键字来指定
  • key和reverse用法同sort()
dic = {'a':2, 'b':3, 'c':0, 'd':1}
L = sorted(dic.keys(), key = lambda x : x[1])
print(L)
>>>['c', 'd', 'a', 'b']

ASCII

ASCII

ord(a) #字符a对应ASCII值
chr(i) #ASCII值对应字符

enumerate()

将一个可遍历的数据对象组合成一个索引序列,同时列出数据和数据下标,一般用在for循环中。

enumerate(sequence, [start=0])
  • sequence为一个序列、迭代器或其他支持迭代的对象
  • start为下标起始位置
for i, item in enumerate(items):
    print i, item

int()

class int(x,base = 10) 
  • x 字符串或者数字
  • base-进制数,默认十进制

map()

map(function, iterable, ...)
  • function函数
  • iterable一个或多个序列
  • 输出Python3.x返回迭代器,Python3.x返回列表
a_list = list(map(int,input().split()))
'''
input输入:1 2 3 4
map(int,input().split()
	函数:int
	序列:input().split()
	输出:<map object at 0x100d3d550>   返回迭代器
list() 转换成列表
''' 

进制转换

9进制(3021)转10进制:1*9^0 + 2*9^1 + 0*9^2 + 3*9^3 = 2206

10进制(2206)转9进制:2206/9=245…1 245/9=27…2 27/9=3…0 9进制即为3021

list&string转换

s = 'asdfghjklkjhgfds'  #字符串
l = list(s)             #字符串转列表
s = ''.join(l)          #列表转字符串
ll = ['a', 'b', 'c']
s1 = ''.join(l)     #>>>"abc"
s2 = ' '.join(l)    #>>>"a b c"
s3 = ','.join(l)    #>>>"a,b,c"

datatime

begin = datetime.date(2022, 1, 1)
end = datetime.date(2022, 12, 31)
day = datetime.timedelta(days=1)

Python 中re.split()方法

re.split()切割功能非常强大

>>> import re
>>> line = 'aaa bbb ccc;ddd   eee,fff'
>>> line
'aaa bbb ccc;ddd   eee,fff'

单字符切割

>>> re.split(r';',line)
['aaa bbb ccc', 'ddd\teee,fff']

两个字符以上切割需要放在 [ ] 中

>>> re.split(r'[;,]',line)
['aaa bbb ccc', 'ddd\teee', 'fff']

所有空白字符切割

>>> re.split(r'[;,\s]',line)
['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff']

使用括号捕获分组,默认保留分割符

>>> re.split(r'([;])',line)
['aaa bbb ccc', ';', 'ddd\teee,fff']

不想保留分隔符,以(?: …)的形式指定

>>> re.split(r'(?:[;])',line)
['aaa bbb ccc', 'ddd\teee,fff']

Python 集合set()使用

在python3中按数据类型的可变与不可变大致分为如下几种类型:

不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3个):List(列表)、Dictionary(字典)、Set(集合)。

1.集合的特点

无序不重复没有重复的元素,且元素无序存放(故集合没有下标和切片),set的只要作用就是用来给数据去重。
使用时为 { },与字典区分:当花括号里的元素不是键值对的时候为集合。
集合的底层其实是通过字典来封装的

2.set的建立

可以使用大括号 { } 或者 set() 函数创建集合,但是注意如果创建一个空集合必须用 set() 而不是 { },因为{}是用来表示空字典类型的。

1.用set()函数创建set集合

person2 = set(("hello","jerry",133,11,133,"jerru"))
#只能传入一个参数,可以是list,tuple等 类型
print(len(person2))
print(person2)
'''
5
{133, 'jerry', 11, 'jerru', 'hello'}
'''

2.add()

a=set()
a.add("a")
a.add("b")
print(a)

3.用{}创建set集合。空set集合用set()函数表示,不可a={}。

person ={"student","teacher","babe",123,321,123} #同样各种类型嵌套,可以赋值重复数据,但是存储会去重
print(len(person))  #存放了6个数据,长度显示是5,存储是自动去重
print(person) #但是显示出来则是去重的
'''
5
{321, 'teacher', 'student', 'babe', 123}
'''

#空set集合用set()函数表示
person1 = set() #表示空set,不能用person1={}
print(len(person1))
print(person1)
'''
0
set()
'''

4.set集合的转化

a=["awe","weg","dawqgg"]
c=set(a)
print(c)

b="chenshuagege"
d=set(b)
print(d)

al=("233","34455")
aw=set(al)
print(al)

3.常见使用注意事项

#set对字符串也会去重,因为字符串属于序列。
str1 = set("abcdefgabcdefghi")
str2 = set("abcdefgabcdefgh")
print(str1,str2)
print(str1 - str2) #-号可以求差集
print(str2 - str1)  #空值
#print(str1 + str2)  #set里不能使用+号
====================================================================
{'d', 'i', 'e', 'f', 'a', 'g', 'b', 'h', 'c'} {'d', 'e', 'f', 'a', 'g', 'b', 'h', 'c'}
{'i'}
set()

4.set的常用方法

4.1 set集合的增删改查操作

  • add 用于加入元素
  • update 用于集合的合并
  • remove 当移除一个集合里没有的元素时,报错
  • discard 当移除一个集合里没有的元素时,不会报错
  • del 仅可对集合本身使用,不可用于元素,因为元素在集合里为混乱排放,无下标
  • clear 清空集合,留下空集合
  • pop 随机删除集合里的一个元素
#1.给set集合增加数据
person ={"student","teacher","babe",123,321,123}
person.add("student") #如果元素已经存在,则不报错,也不会添加,不会将字符串拆分成多个元素,区别update
print(person)
person.add((1,23,"hello")) #可以添加元组,但不能是list
print(person)
'''
{321, 'babe', 'teacher', 'student', 123}
{(1, 23, 'hello'), 321, 'babe', 'teacher', 'student', 123, 1, 3}
'''

# update用于集合的合并,可以把多个集合添加到一个集合里面。可以iterar的数据都可以添加成set集合
person.update("abc")#使用update不能添加字符串,会拆分
print(person)  #会将字符串拆分成a,b,c三个元素
'''
{321, 1, 3, 'b', 'c', 'teacher', (1, 23, 'hello'), 'a', 'babe', 'student', 123}
'''

set1 = set()
set1.add('武动乾坤')
set2 = {'jsy', '稻香', '爱的代价', '大碗宽面'}
set2.update(set1)
print(set2)
'''
{'大碗宽面', 'jsy', '爱的代价', '稻香', '武动乾坤'}
'''

#2.从set里删除数据
person.remove("student")#按元素去删除
print(person)
#print("student")如果不存在 ,会报错。
'''
{321, 1, 3, 'c', 'b', (1, 23, 'hello'), 'teacher', 'babe', 'a', 123}
'''
person.discard("student")#功能和remove一样,好处是没有的话,不会报错
ret = person.pop() #在list里默认删除最后一个,在set里随机删除一个。
print(person)
print(ret) #pop()返回的是被删除掉的那一项
'''
{1, 3, (1, 23, 'hello'), 'teacher', 'b', 'a', 'babe', 123, 'c'}
'''

#3.更新set中某个元素,因为是无序的,所以不能用角标
#所以一般更新都是使用remove,然后在add

#4.查询是否存在,无法返回索引,使用in判断
if "teacher" in person:
    print("true")
else:
    print("不存在")
'''
true
'''

#5.终极大招:直接清空set
print(person)
person.clear()
print(person)
'''
set()
'''

4.2 其它用法

交 并 差集操作,可用运算符表示交集,并集,差集
交集 intersection 或 &

并集 union 或 |

差集 difference 或 -

#取两者的交集
b={1,23}
a={23,5}
ret=b.intersection(a)
print(ret)

#取两者的交集,intersection_update会改变b的内容
b={1,23}
a={23,5}
b.intersection_update(a)
print(b)

#union是把两个set集合合起来
a={"a","b","c"}
b={"a","wa"}
wt=a.union(b)
print(wt)

#difference表示的意思是a中的内容b是没有的,但是这个不会修改a自身的值,而是付给ret了
a={"12","14","234"}
b={"12","23"}
ret=a.difference(b)
print(ret)

#difference_update表示的意思是a中的内容b是没有的,执行完,会修改a的内容
a={"12","14","234"}
b={"12","23"}
a.difference_update(b)
print(a)

#symmetric_difference为把两个set集合里相同的内容当作边然后取这边两边的内容
a={"a","b","c"}
b={"a","wa"}
ret=a.symmetric_difference(b)
print(ret)
a.symmetric_difference(b)
print(a)

#可用运算符表示交集,并集,差集
set2 = {1, 2, 3, 4, 5}
set3 = {3, 4, 5, 6, 7, 8, 9} 
print(set2 & set3)  # 交集符号  &
print(set2 | set3)  # 并集符号 |
print(set2 - set3)  # 差集符号 -

b={1,23}
a={23,5}
#如果a与b有集合的话,就返回false;如果没有集合的话,就返回true
ret=b.isdisjoint(a)
print(ret)

b={1,23,5}
a={23,5}
#issuperset说明b是否是a的父亲,如果是就输出true,如果不是输出false
ret=b.issuperset(a)
print(ret)

b={1,23,5}
a={23,5}
#b是否是a的子,如果是就输出true,如果不是就输出false
ret=b.issubset(a)
print(ret)

5.列表,元组,字典,集合 总结

list: 允许重复,有序,有下标,可切片
tuple: 允许重复,里面元素不能进行增删改,只能查看
dict: 字典里的元素以键值对的形式存在 键:唯一性 值:可以重复
set: 元素不允许重复,且具有无序性

5.1 它们之间的类型转换

  1. 列表,元组,集合,此三者均可相互转
    list----->tuple,set 列表转集合时,注意不能有重复元素,否则长度改变
    tuple----->list,set
    set----->list,tuple
  2. 当字典参与的转换时,需特殊对待
    dict----->list,tuple 仅能将字典的键转换,不能将值转换
    list----->dict 列表内必须是列表或是元组,且其中只有两个元素时,可转
list = [['a', {1}], ('', 2), ('c', 3)]
print(dict(list))
'''
{‘a’: {1}, ‘’: 2, ‘c’: 3}
'''

输出:
{‘a’: {1}, ‘’: 2, ‘c’: 3}

转换代码转换代码
list转arraya1 = np.array(l1)array转listl1 = a1.tolist()
list转sets1 = set(l1)set转listl1 = list(s1)
list转tuplet1 = tuple(l1)tupel转listl1 = list(t1)
array转sets1 = set(a1)set转arraya1 = np.array(s1)
array转tuplet1 = tuple(a1)tuple转arraya1 = np.array(t)
set转tuplet1 = tuple(s1)tuple转sets1 = set(t1)

5.2 集合和列表方法上的区别

正是由于集合的无序性,没有下标,故在方法上与列表有些差异。

  • append(添加元素) extend(实现列表的拼接) insert(在某一下标插入元素) ----->list
  • add(添加元素) update(两个集合的合并) ---->set

bin(num).count(‘1’)

bin(num).count('1')

# bin()函数得到num的2进制数

# .count('1')得到2进制数中1的个数

num.bit_length()

num.bit_length()

# 得到num 2进制数的长度

collections.Counter

哈希表在python中可以用collections.Counter计数来体现。
该方法用于统计某序列中每个元素出现的次数,以键值对的方式存在字典中。但类型其实是Counter。

nums = [1, 2, 3, 1, 2, 1]
counts = collections.Counter(nums)
print(counts)
## Counter({1: 3, 2: 2, 3: 1})

凭借这个结构,可以计算出某个序列中出现次数最多的某个元素。也即在得到了counts之后求max即可。但这个max需要给依据索引。

print(max(counts)) # 3,这里只是求得最大的键值
print(max(counts.keys(), key=counts.get)) # 1,这里是按照key方法求最大

这里max是两个参数,前一个代表要max的是什么,也就是要返回最大键,后面的key代表要返回的最大的依据是什么,默认是本身,但这里给了key方法,count.get也就是求值,所以该方法就是说返回一个最大键,但这个最大的依据是值。如果某个键值对的值是最大的,那就返回其键。

这里max是两个参数,前一个代表要max的是什么,也就是要返回最大键,后面的key代表要返回的最大的依据是什么,默认是本身,但这里给了key方法,count.get也就是求值,所以该方法就是说返回一个最大键,但这个最大的依据是值。如果某个键值对的值是最大的,那就返回其键。

sort()

正序排序

a=[2,6,3,8,1,34,88]
a.sort(reverse=False)
print(a)

# >>> [1,2,3,6,8,34,88]

降序排序

a=[2,6,3,8,1,34,88]
a.sort(reverse=True)
print(a)

# >>> [88,34,8,6,3,2,1]

ListNode

如何在Python中创建与使用链表(单链表)

Leetcode官方定义的链表:

# Definition for singly-linked list.
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

创建一个链表

可以使用如下方式:

head = None
for i in [4,3,2,1,0]:
    head = ListNode(i,head)

首先让表头(最终会是最后一个元素)指向None,然后利用for循环依次添加这个链结的前一个元素。因此,最终获得的链表会是这样的:

遍历一个链表

这里使用一个列表来保存链表中元素的值。在每次获取head的值之后,向前移一位。由于是单链表,所以通过定义head2来保留链表的头部。否则,while循环遍历后将无法访问链表的元素。

value = []
head2 = head
while head:
    value.append(head2.val)
    head2 = head2.next

这里使用一个列表来保存链表中元素的值。在每次获取head的值之后,向前移一位。由于是单链表,所以通过定义head2来保留链表的头部。否则,while循环遍历后将无法访问链表的元素。

List

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

Python 表达式结果描述
len([1, 2, 3])3长度
[1, 2, 3] + [4, 5, 6][1, 2, 3, 4, 5, 6]组合
[‘Hi!’] * 4[‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’]重复
3 in [1, 2, 3]True元素是否存在于列表中
for x in [1, 2, 3]: print x,1 2 3迭代
list[2]33列表下标为2的值
list[2:][3,4,5]列表下标为2的值开始到列表结尾
list[:2][1,2]列表开头到第2个值
list[-2]44列表倒数第二个值

Python list包含以下函数:

序号函数
1cmp(list1, list2)比较两个列表的元素
2len(list)列表元素个数
3max(list)返回列表元素最大值
4min(list)返回列表元素最小值
5list(seq)将元组转换为列表

Python list包含以下方法:

序号方法
1list.append(obj) 在列表末尾添加新的对象
2list.count(obj) 统计某个元素在列表中出现的次数
3list.extend(seq)列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4list.index(obj)从列表中找出某个值第一个匹配项的索引位置
5list.insert(index, obj) 将对象插入列表
6list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7list.remove(obj)移除列表中某个值的第一个匹配项
8list.reverse()反向列表中元素
9list.sort(cmp=None, key=None, reverse=False)对原列表进行排序

**PS:**列表不能单纯的list1=list2,这样list2变化时list1也会变,用list.extend(seq)

反转列表:

class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        # l = len(s)
        # for i in range(int(l/2)):
        #     s[i], s[l - i - 1] = s[l - i - 1], s[i]
        
        #s.reverse()

        s[:] = s[::-1]  #PS:也可以用于字符串的反转

        # l ,r = 0, len(s) - 1
        # while l < r:
        #     s[l], s[r] = s[r], s[l]
        #     l, r = l + 1, r - 1

判断是否为整数

isinstance(a, int)
# 判断a是否是int整数
# 返回True or False

取余

d, mod = divmod(a, b)  # 返回除数和余数
d = a//b # 取整
mod = a % b  # 取余

itertools之排列组合迭代器(Combinatoric Iterators)

一、itertools.product

语法:itertools.product(iterables, repeat=1)

理解:product是乘积的意思,以笛卡尔乘积的形式去组合多个iterable对象里面的元素,并以元组的形式输出。

例子:

for i in itertools.product('ABC', 'xy'):
	print(i)
	time.sleep(0.5)

# 输出结果:  
('A', 'x')
('A', 'y')
('B', 'x')
('B', 'y')
('C', 'x')
('C', 'y')

# 如果将第一行代码改为:for i in itertools.product('AB', repeat=3)那么输出的结果为:  
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'B', 'A')
('A', 'B', 'B')
('B', 'A', 'A')
('B', 'A', 'B')
('B', 'B', 'A')
('B', 'B', 'B')  

二、itertools.permutations

语法:itertools.permutations(iterable, r=None)

理解:这个方法能将传入的iterable对象里面的元素以r的长度进行排列组合,特点是,每个元素不会与自身进行排列组合

例子:

for i in itertools.permutations('ABC', 2):
	print(i)
	time.sleep(0.5)  

# 输出结果为:  
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')

三、itertools.combinations

语法:itertools.combinations(iterable, r)

理解:输出iterable对象里长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序 (不带重复)

例子:

for i in itertools.combinations('ABC', 2):  
	print(i)
	time.sleep(0.5)

# 输出结果为:  
('A', 'B')
('A', 'C')
('B', 'C')  

# 如果将第一行代码改为:for i in itertools.combinations('AAC', 2)则输出结果为:  
('A', 'A')
('A', 'C')
('A', 'C')  

四、itertools.combinations_with_replacement

语法:itertools.combinations_with_replacement(iterable, r)

理解:此处类似于itertools.combinations,但是唯一的区别在于这个方法允许元素自身和自身形成排列组合

例子:

for i in itertools.combinations_with_replacement('ABC', 2):  
	print(i)
	time.sleep(0.5)  

# 结果输出为:  
('A', 'A')
('A', 'B')
('A', 'C')
('B', 'B')
('B', 'C')
('C', 'C')  

官方文档

String

python用[]来截取字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WVRGC4XL-1680883606962)(null)]

img

Python 字符串运算符

下表实例变量 a 值为字符串 “Hello”,b 变量值为 “Python”:

操作符描述实例
+字符串连接a + b 输出结果: HelloPython
*重复输出字符串a*2 输出结果:HelloHello
[]通过索引获取字符串中字符a[1] 输出结果 e
[ : ]截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。a[1:4] 输出结果 ell
in成员运算符 - 如果字符串中包含给定的字符返回 True‘H’ in a 输出结果 True
not in成员运算符 - 如果字符串中不包含给定的字符返回 True‘M’ not in a 输出结果 True
r/R原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。print( r'\n' ) print( R'\n' )>>>\n

Python 转义字符

在需要在字符中使用特殊字符时,python 用反斜杠 ** 转义字符。如下表:

转义字符描述实例
(在行尾时)续行符>>> print("line1 \ ... line2 \ ... line3") line1 line2 line3 >>>
\反斜杠符号>>> print("\\") \
单引号>>> print('\'') '
"双引号>>> print("\"") "
\a响铃>>> print("\a")执行后电脑有响声。
\b退格(Backspace)>>> print("Hello \b World!") Hello World!
\000>>> print("\000") >>>
\n换行>>> print("\n") >>>
\v纵向制表符>>> print("Hello \v World!") Hello World! >>>
\t横向制表符>>> print("Hello \t World!") Hello World! >>>
\r回车,将 \r 后面的内容移到字符串开头,并逐一替换开头部分的字符,直至将 \r 后面的内容完全替换完成。>>> print("Hello\rWorld!") World! >>> print('google runoob taobao\r123456') 123456 runoob taobao
\f换页>>> print("Hello \f World!") Hello World! >>>
\yyy八进制数,y 代表 0~7 的字符,例如:\012 代表换行。>>> print("\110\145\154\154\157\40\127\157\162\154\144\41") Hello World!
\xyy十六进制数,以 \x 开头,y 代表的字符,例如:\x0a 代表换行>>> print("\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21") Hello World!
\other其它的字符以普通格式输出

python字符串格式化符号:

符 号描述
%c格式化字符及其ASCII码
%s格式化字符串
%d格式化整数
%u格式化无符号整型
%o格式化无符号八进制数
%x格式化无符号十六进制数
%X格式化无符号十六进制数(大写)
%f格式化浮点数字,可指定小数点后的精度
%e用科学计数法格式化浮点数
%E作用同%e,用科学计数法格式化浮点数
%g%f和%e的简写
%G%f 和 %E 的简写
%p用十六进制数格式化变量的地址
print ("我叫 %s 今年 %d 岁!" % ('小明', 10))
>>>我叫 小明 今年 10 岁!

Python 的字符串内建函数

序号方法及描述
1capitalize() 将字符串的第一个字符转换为大写
2center(width, fillchar)返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。
3count(str, beg= 0,end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
4bytes.decode(encoding=“utf-8”, errors=“strict”) Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。
5encode(encoding=‘UTF-8’,errors=‘strict’) 以 encoding 指定的编码格式编码字符串,如果出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’
6endswith(suffix, beg=0, end=len(string)) 检查字符串是否以 suffix 结束,如果 beg 或者 end 指定则检查指定的范围内是否以 suffix 结束,如果是,返回 True,否则返回 False。
7expandtabs(tabsize=8) 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8 。
8find(str, beg=0, end=len(string)) 检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1
9index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在字符串中会报一个异常。
10isalnum() 如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False
11isalpha() 如果字符串至少有一个字符并且所有字符都是字母或中文字则返回 True, 否则返回 False
12isdigit() 如果字符串只包含数字则返回 True 否则返回 False…
13islower() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
14isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False
15isspace() 如果字符串中只包含空白,则返回 True,否则返回 False.
16istitle() 如果字符串是标题化的(见 title())则返回 True,否则返回 False
17isupper() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
18join(seq) 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
19len(string) 返回字符串长度
20ljust(width[, fillchar])返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。
21lower() 转换字符串中所有大写字符为小写.
22lstrip() 截掉字符串左边的空格或指定字符。
23maketrans() 创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
24max(str) 返回字符串 str 中最大的字母
25min(str) 返回字符串 str 中最小的字母
26replace(old, new [, max])把 将字符串中的 old 替换成 new,如果 max 指定,则替换不超过 max 次。
27rfind(str, beg=0,end=len(string)) 类似于 find()函数,不过是从右边开始查找.
28rindex( str, beg=0, end=len(string)) 类似于 index(),不过是从右边开始.
29rjust(width,[, fillchar])返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度 width 的新字符串
30rstrip() 删除字符串末尾的空格或指定字符。
31split(str=“”, num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串
32splitlines([keepends])按照行(‘\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
33startswith(substr, beg=0,end=len(string)) 检查字符串是否是以指定子字符串 substr 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。
34strip([chars])在字符串上执行 lstrip()和 rstrip()
35swapcase() 将字符串中大写转换为小写,小写转换为大写
36title() 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
37translate(table, deletechars=“”) 根据 table 给出的表(包含 256 个字符)转换 string 的字符, 要过滤掉的字符放到 deletechars 参数中
38upper() 转换字符串中的小写字母为大写
39zfill (width) 返回长度为 width 的字符串,原字符串右对齐,前面填充0
40isdecimal() 检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false。

位运算

位运算就是对二进制位的操作

位运算符说明
<<按位左移,左移n位相当于乘以2的n次方
>>按位右移 ,左移n位相当于除以2的n次方
&按位与,二进制位数同且为1结果位为1
l按位或 ,二进制位数或有1结果位为1
^按位异或 ,二进制位数不同结果位为1
~按位取反,二进制位0和1结果位互换
a=11
b=a<<3                  # 将 a 左移三位
print(a)
print(b)                # b=a*(2**3)
>>> 11
>>> 88
print(bin(a)[2:])       # 切片,去掉前面的:0b
print(bin(b)[2:])       # 二进制右边补上三个000
>>> 1011
>>> 1011000

进制表示

二进制,八进制,十进制,十六进制的表示方法

>>> 0b10  # 以0b开头表示的是二进制
2
>>> 0o10  # 以0o开头表示的是八进制
8
>>> 0x10  # 以0x开头表示的是十六进制
16
>>> 10  # 正常输入表示的是十进制
10

将其他进制的字符转换为二进制,使用函数bin()

>>> bin(10)   # 十进制转换为二进制
'0b1010'
>>> bin(0b11)  # 二进制转化为二进制
'0b11'
>>> bin(0o23)  # 八进制转换为二进制
'0b10011'
>>> bin(0x2a)  # 十六进制转换为二进制
'0b101010'

转为八进制使用oct()函数,转为十六进制使用hex()函数

获取ascII码使用ord()函数

Python 里面的reduce函数和lambda

a = [2,22,222]
Sn = reduce(lambda x,y:x+y,a)

其中reduce函数是python中的一个二元内建函数,它可以通过传给reduce中的函数(必须是二元函数)依次对数据集中的数据进行操作。例如上述代码传给reduce的函数是做加法,数据集是a,那么reduce函数的作用就是将数据集中的数据依次相加,最后打印出的结果就是246。

函数语法: reduce(function, iterable[,initializer])

函数参数含义如下:

1、function 需要带两个参数,1个是用于保存操作的结果,另一个是每次迭代的元素。

2、iterable 待迭代处理的集合

3、initializer 初始值,可以没有。

reduce函数的运作过程是,当调用reduce方法时:

1、如果存在initializer参数,会先从iterable中取出第一个元素值,然后initializer和元素值会传给function处理;

接着再从iterable中取出第二个元素值,与function函数的返回值 再一起传给function处理,以此迭代处理完所有元素。最后一次处理的function返回值就是reduce函数的返回值。

2、如果不存在initializer参数,会先从iterable中取出第一个元素值作为initializer值,然后以此从iterable取第二个元素及以后的元素进行处理。特殊情况下,如果集合只有一个元素,则无论function如何处理,reduce返回的都是第一个元素的值。

看例子:

reduce(lambda re,x:re+x,[2,4,6])
>>> 12

这里我们用的是lambda表达式(匿名函数),带两个参数,re就是指的是每次操作后的返回值,这里没带initializer参数,参数x就是代表集合中的元素。

第一轮操作时,re的初始值为第一个元素为2,x为第二个元素4, 运算后re的结果是6.

第二轮操作时,re的值就是上次的结果6,x的值为6,这样结果为12.

因为只有三个元素,又没有initializer参数,所以只会执行两轮。

reduce(lambda re,x:re+x,[2,4,6],10)
>>> 22. 

这个例子传入了初始化参数10 ,这样re的初始化值为10.

有三个元素,需要操作三轮,结果就是22了

凡是要对一个集合进行操作的,并且要有一个统计结果的,能够用循环或者递归方式解决的问题,一般情况下都可以用reduce方式实现。在python 3.0.0.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce。

而其中的lambd表达式是一种精简函数的表达方法,省略了函数的定义,命名等问题。

lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。

如下函数,定义了一个lambda的表达式,求三个数的和:

f = lambda x,y,z:x+y+x
print f(1,2,3)
>>> 4

f = lambda x,y,z:x+y+z
print f(1,2,3)
>>> 6

用lambda表达式求n的阶乘:

n = 5
print reduce(lambda x,y:x*y,range(1,n+1))
>>> 120

lambda表达式也可以用在def函数中:

def action(x):
    return lambda y:x+y
a = action(2)
print a(22)
>>> 24

这里定义了一个action函数,返回了一个lambda表达式。其中lambda表达式获取到了上层def作用域的变量名x的值。

a是action函数的返回值,a(22),即是调用了action返回的lambda表达式。

这里也可以把def直接写成lambda形式。如下:

b = lambda x:lambda y:x+y
a = b(2)
print a(22)#print (b(2))(22)
>>> 24

取出第一个元素值作为initializer值,然后以此从iterable取第二个元素及以后的元素进行处理。特殊情况下,如果集合只有一个元素,则无论function如何处理,reduce返回的都是第一个元素的值。

看例子:

reduce(lambda re,x:re+x,[2,4,6])
>>> 12

这里我们用的是lambda表达式(匿名函数),带两个参数,re就是指的是每次操作后的返回值,这里没带initializer参数,参数x就是代表集合中的元素。

第一轮操作时,re的初始值为第一个元素为2,x为第二个元素4, 运算后re的结果是6.

第二轮操作时,re的值就是上次的结果6,x的值为6,这样结果为12.

因为只有三个元素,又没有initializer参数,所以只会执行两轮。

reduce(lambda re,x:re+x,[2,4,6],10)
>>> 22. 

这个例子传入了初始化参数10 ,这样re的初始化值为10.

有三个元素,需要操作三轮,结果就是22了

凡是要对一个集合进行操作的,并且要有一个统计结果的,能够用循环或者递归方式解决的问题,一般情况下都可以用reduce方式实现。在python 3.0.0.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce。

而其中的lambd表达式是一种精简函数的表达方法,省略了函数的定义,命名等问题。

lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。

如下函数,定义了一个lambda的表达式,求三个数的和:

f = lambda x,y,z:x+y+x
print f(1,2,3)
>>> 4

f = lambda x,y,z:x+y+z
print f(1,2,3)
>>> 6

用lambda表达式求n的阶乘:

n = 5
print reduce(lambda x,y:x*y,range(1,n+1))
>>> 120

lambda表达式也可以用在def函数中:

def action(x):
    return lambda y:x+y
a = action(2)
print a(22)
>>> 24

这里定义了一个action函数,返回了一个lambda表达式。其中lambda表达式获取到了上层def作用域的变量名x的值。

a是action函数的返回值,a(22),即是调用了action返回的lambda表达式。

这里也可以把def直接写成lambda形式。如下:

b = lambda x:lambda y:x+y
a = b(2)
print a(22)#print (b(2))(22)
>>> 24
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值