一、内置函数
1. complex([real[,imag]])
返回一个复数,实部 + 虚部*1j,或者把字符串或者数字转成复数形式。 参数可以是复数表达式,也可以是字符串。当参数是字符串的时候,数字与操作符之间不能有空格。即comple('1 + 2j')是错误的。 print(complex(1, 2)) print(complex(1 + 2j)) print(complex('1+2j')) # 输出 1+2j print(complex(1)) # 输出 1+0j
满足:实部 + 虚部*1j 的数被称为复数。 a = 1 + 3j # 求实部 print(a.real) # 求虚部 print(a.imag) # 求共轭
print(a.conjugate()) 2. chr(i) 与 ord(i)
chr(i) 是将当前整数 i 转成对应的 ascii 字符,可以是十进制,也可以是十六进制,其中0 <= i <= 0x10ffff (1114111)。其对应的逆操作为 ord(i),i 为 ascii 字符。
11
下面的函数演示如何求一个可迭代对象的 ascil字符 或者其对应的数值。注意函数 ordplus ,参数 x 中的每一个元素必须是单个字符,如果是列表,形式如下:[‘P’ , ‘y’, ‘t’ , ‘h’, ‘o’ , ‘n’]。 def chrplus(x): chr_string = '' for elem in x:
chr_string += chr(elem) return chr_string def ordplus(x): ord_list = [] for elem in x:
ord_list.append(ord(elem)) return ord_list x = 'Python高效编程' temp = ordplus(x) print(temp)
# 输出:[112, 121, 116, 104, 111, 110, # 39640, 25928, 32534,31243] init = chrplus(temp) print(init)
# 输出:Python高效编程 3.enumerate(iterable, start=0)
返回 enumerate 对象。迭代对象必须是序列,迭代器,或者其他支持迭代的对象。enmerate() 函数返回的是迭代器,同样是可迭代对象。每次迭代的元素,都包含元素在序列里的序号(strat 默认值为 0) 和元素对应值。因此,我们可以用 for 循环获取返回值。
12
等价于:
def enumerate(sequence, start=0): n = start
for elem in sequence: yield n, elem n += 1
for i, elem in enumerate(['P', 'y', 't', 'h', 'o', 'n']): print(i, elem) 4. abs(x)
返回数的绝对值。参数可以是整数或者浮点数。如果参数是复数,返回复数的模。Python 中虚数用数值加上字符 j 的形式表示。要注意 j 前面的数值不能省略,比如 1j。
下面是我写的简易版的 abs 函数: 进群:960410445 即可获取数十套PDF! from math import sqrt def naive_abs(x):
# isinstance 判断参数x是否为整数或浮点数
if isinstance(x, int) or isinstance(x, float): if x < 0: x = - x
# 判断参数x是否为复数
elif isinstance(x, complex): # x.real 复数的实部 # x.imag 复数的虚部 real = x.real
13
imag = x.imag # 求复数的模
x = sqrt(real ** 2 + imag ** 2) else :
return '请输入 int float complex' return x print(abs(3+4j)) print(naive_abs(3+4j)) # 输出 5.0 print(abs(-6)) print(naive_abs(-6)) # 输出 6
二、算法与数据结构 1. 二分查找
要想使用二分搜索,首先要确保迭代序列是有序的。对于无序序列,我们首先要进行排序操作。
每次循环缩小一半搜索范围,时间复杂度为 O(logn)。每次循环,比较选取的中间数与需要查找的数字,如果待查数小于中间数,就减少右界至中间数的前一个数;如果待查数大于中间数,就增加左界到中间数后一个数;如果待查数等于中间数,返回中间数的下标,该下标即为待查数在序列中的位置。当左界大于右界时,循环结束,说明序列中并没有待查数。 def binary_search(item, find): # 有序可迭代对象
left, right = 0, len(item) - 1 mid = left + (right - left) // 2
14
while left <= right: if item[mid] == find: return mid
elif item[mid] > find: right = mid - 1 else:
left = mid + 1
mid = left + (right - left) // 2 return None
seq = [1, 4, 7, 9, 13, 17, 18, 21, 34, 45, 65] binary_search(seq, 13) # 输出:4 2. 快速排序
首先要打乱序列顺序 ,以防算法陷入最坏时间复杂度。快速排序使用“分而治之”的方法。对于一串序列,首先从中选取一个数,凡是小于这个数的值就被放在左边一摞,凡是大于这个数的值就被放在右边一摞。然后,继续对左右两摞进行快速排序。直到进行快速排序的序列长度小于 2 (即序列中只有一个值或者空值)。 # quicksort import random def quicksort(seq): if len(seq) < 2: return seq else:
base = seq[0]
left = [elem for elem in seq[1:] if elem < base] right = [elem for elem in seq[1:] if elem > base] return quicksort(left) + [base] + quicksort(right)
15