Python

本文主要用于记录LeetCode中遇到的比较好的一些python写法以及招聘笔试面试中遇到的问题。

self参数

在python的类的方法定义中,请描述’self’参数的作用?  
self参数在类定义中,指类本身,可以用来传递外部参数。

math库

log函数

描述:  
log()返回 x 的自然对数。

语法:

1
2
3
import math

math.log(x[, base])

参数:

  • x – 数值表达式。
  • base – 可选,底数,默认为 e。

返回值:
返回 x 的自然对数,x>0。

实例:

1
2
3
4
import math

print "math.log(10,2) : ", math.log(10,2)#相当于log_2(10)
3.32192809489

sum函数

描述:
sum() 方法对系列进行求和计算。

语法:
sum(iterable[, start])

参数:

  • iterable – 可迭代对象,如:列表、元组、集合。
  • start – 指定相加的参数,如果没有设置这个值,默认为0。

返回值:
返回计算结果。

实例:

1
2
3
4
5
6
7
8
sum([0,1,2])
3

sum((2, 3, 4), 1)
10

sum([0,1,2,3,4], 2)
12

常见用法:
将程序变得更pythic,以171.Excel表列序号为例:

  • 常规
1
2
3
4
res = 0
for index in range(len(s)):
res += (26 ** (len(s) - index - 1)) * (ord(s[index]) - ord('A') + 1)
return res
  • sum()
1
return sum((26 ** (len(s) - index - 1)) * (ord(s[index]) - ord('A') + 1) for index in range(len(s)))

把每次迭代的结果以sum的方式一次性取和。

ord函数

描述:
它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。

语法:

1
ord(c)

参数:
c – 字符

返回值:
返回值是对应的十进制整数。

实例:

1
2
3
4
5
6
ord('a')
97
ord('b')
98
ord('c')
99

排序

数组倒序

1
2
3
a = [1, 2, 3, 4, 5]
a[::-1]
》[5, 4, 3, 2, 1]

sort函数

sort()是Python列表(仅适用于列表)的一个内置的排序方法,list.sort()方法排序时直接修改原列表,返回None;
语法:

1
list.sort(*, key=None, reverse=None)

参数:

  • key
    带一个参数的函数,返回一个值用来排序,默认为 None
  • reverse
    表示排序结果是否反转,默认是升序

实例:

1
2
3
4
5
6
a=['1',1,'a',3,7,'n']
print a.sort()
None
a

[1, 3, 7, '1', 'a', 'n']

sorted函数

sorted()是迭代器(不仅针对列表)的排序方法,可以保留原列表,返回新列表。
语法:

1
sorted(iterable[, key][, reverse])

参数:

  • key
    带一个参数的函数,返回一个值用来排序,默认为 None
  • reverse
    表示排序结果是否反转

实例:

1
2
3
a = (1,2,4,2,3)
print(sorted(a))
》[1, 2, 2, 3, 4]

set

数据类型set是一个无序不重复元素集。  
基本功能包括关系测试和消除重复元素。  
集合对象支持联合、交、差和对称差集等数学运算。

支持:

  • x in set
  • len(set)
  • for x in set

不支持:

  • indexing
  • slicing
  • 其它类序列(sequence-like)的操作

元素集合

1
2
3
4
x = set('spam')
y = set(['h','a','m'])
x, y
》(set(['a', 'p', 's', 'm']), set(['a', 'h', 'm']))

交集

1
2
3
4
x = set('spam')
y = set(['h','a','m'])
x & y
》set(['a', 'm'])

交集

1
2
3
4
5
x = set('spam')
y = set(['h','a','m'])
x | y
x.union(y)
》set(['a', 'p', 's', 'h', 'm'])

差集

1
2
3
4
x = set('spam')
y = set(['h','a','m'])
x - y # 差集 在x中但不在y中
》set(['p', 's'])

对称差集

1
2
3
4
x = set('spam')
y = set(['h','a','m'])
x ^ y #对称差集  在x或y中,但不会同时出现在二者中
》set(['p', 's'])

去除重复元素

1
2
3
4
5
6
x = set('spam')
y = set(['h','a','m'])
#去除重复元素:
a = [11,22,33,44,11,22]
set(a)
》set([33, 11, 44, 22])

添加元素

1
2
3
4
5
# 添加一项
x.add('x')

# 添加多项
x.update([10,37,42])

删除元素

1
2
3
4
5
6
7
8
9
#删除一项
x.remove('H') #如果不存在就报错
x.discard('H') #存在就删除

# 删除 set 中的所有元素
x.clear()

# 删除并且返回 set “s”中的一个不确定的元素, 如果为空则报错
s.pop()

set 的长度

1
len(x)

关系测试

1
2
3
4
5
6
7
8
9
10
s in x   # 测试 s 是否是 x 的成员
s not in x # 测试 s 是否不是 x 的成员

s.issubset(t) #测试是否 s 中的每一个元素都在 t 中
s <= t

s.issuperset(t) # 测试是否 t 中的每一个元素都在 s 中
s >= t

s.copy() # 返回 set “s”的一个浅复制

zip函数

描述:
从参数中的多个迭代器取元素组合成一个新的迭代器。

语法:

1
zip(iterable,[iterable...])

注意:
当有多个参数时,zip(a,b)中a和b的维数相同,若不相同时,取最小的维数进行组合。

参数:  
一个或多个迭代器,例如,元组、列表、字典等。

返回值:
返回一个zip对象,其内部元素为元组;
可以转化为元组、列表、字典

实例:

  • 单个参数
1
2
3
4
5
6
list1 = [1, 2, 3, 4]
tuple1 = zip(list1)
print("zip()函数的返回类型:\n", type(tuple1))
》<class 'zip'>
print("zip对象转化为列表:\n", list(tuple1))
》[(1,), (2,), (3,), (4,)]
  • 多个参数
1
2
3
4
5
6
7
8
9
m = [[1,2,3], [4,5,6], [7,8,9]] 
n = [[2,2,2], [3,3,3], [4,4,4]]
p = [[2,2,2], [3,3,3,]

list(zip(m, n))
》[([1, 2, 3], [2, 2, 2]), ([4, 5, 6], [3, 3, 3]), ([7, 8, 9], [4, 4, 4])]

list(zip(m, p))
》[([1, 2, 3], [2, 2, 2]), ([4, 5, 6], [3, 3, 3])]

*zip(*iterables)

描述:
*zip()函数是zip()函数的逆过程,将zip对象变成原先组合前的数据。  
实例:

1
2
3
4
5
6
7
m = [[1, 2, 3],  [4, 5, 6],  [7, 8, 9]]
n = [[2, 2, 2], [3, 3, 3], [4, 4, 4]]
m2, n2 = zip(*zip(m, n))
m2
》[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
n2
》[[2, 2, 2], [3, 3, 3], [4, 4, 4]]

zip(*)

1
2
p = [[1,2,3],[4,5,6]]
zip(*p)# 等价于zip([1,2,3],[4,5,6]),相当于把p最外层的[]给去掉了

sys模块

sys.stdin

标准输入:
stdin获得输入(用input()输入的通过它获得)

  • readline()
    每次读取一整行,包括 “\n” 字符。
  • readlines()
    读取所有行并返回列表,包括 “\n” 字符。

sys.stdout

stdout用于输出print()和expression语句以及input()的提示。
print()的本质就是sys.stdout.write(object + ‘\n’)

删除指定字符

strip函数

移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。  
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。  
语法:

1
str.strip([chars])

参数:
chars:移除字符串头尾指定的字符序列。

返回值:
返回移除字符串头尾指定的字符生成的新字符串。

实例:

1
2
3
4
5
6
7
8
9
# 去除首尾字符 0
str = "00000003210Runoob01230000000";
print(str.strip('0'))
3210Runoob0123

# 去除首尾空格
str2 = " Runoob "
print(str2.strip())
》Runoob

replace函数

实则为替代函数,但也非常方便实施删除指定元素。
语法:

1
str.replace(old, new[, max])

参数:

  • old – 将被替换的子字符串。
  • new – 新字符串,用于替换old子字符串。
  • max – 可选字符串, 替换不超过 max 次

返回值:
返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
#展示替换功能
str = "this is string example....wow!!! this is really string";
print str.replace("is", "was");
print str.replace("is", "was", 3);

thwas was string example....wow!!! thwas was really string
thwas was string example....wow!!! thwas is really string

#展示删除功能
str = "test.email+alex@leetcode.com"
print(str.replace('.', ''))
》testemail+alex@leetcode.com

functools库

map函数

描述:
map()会根据提供的函数对指定序列做映射。

语法:

1
map(function, iterable, ...)

参数:

  • function – 函数,有两个参数
  • iterable – 一个或多个序列

返回值:
Python 3.x 返回迭代器。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
def square(x) :            # 定义计算平方数的函数
return x ** 2

map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
》[1, 4, 9, 16, 25]

map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
》[1, 4, 9, 16, 25]

# 提供了两个列表,对相同位置的列表数据进行相加
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

总结:
map(function, iterable, …)  
相当于[f(x) for x in list]

reduce函数

对参数序列中的元素进行累积。  
将序列中的第一个元素与第二个元素进行操作,得到的结果再与第三个元素进行运算。

语法:

1
reduce(function, iterable[, initializer])

参数:

  • function – 函数,有两个参数
  • iterable – 可迭代对象
  • initializer – 可选,初始参数
    返回值:
    返回函数计算结果。

实例:

1
2
3
4
5
6
#实现数组内所有元素相乘
from functools import reduce

list_3 = [3, 3, 3, 3, 2]
print(reduce(lambda a, b: a * b, list_3))
》162