一.昨日内容回顾
内置函数:
max(iterable,key=函数名)
min(iterable,key=函数名)
sorted(iterable,key,reverse)返回值为list
all()全部是真则返回Ture
any()只要有一个是真则返回Ture
enumerate()枚举.
sum(iterable,start)求和,可设置初始值.
isinstance()
divmod(被除数,除数)商 余数
abs 绝对值
slice 切片的规则
len()长度
eval()执行字符串的代码,并返回最终结果
exec()执行流程控制语句.无返回值
pow(x,y,z)x**y 次幂 对z取余
round()保留小数的位数
id()
hash()不可变的数据的哈希值.
range()可控的数字范围
bin()二进制
oct()八进制
hex()十六进制
bytes()
format()
repr()
返回的是迭代器:
filter(key,iterable)相当于筛选模式
map(key,iterable)相当于循环模式.
zip(iter1,iter2,iter3...)拉链方法
reversed()翻转
匿名函数lambda
func=lambda x,y:x+y
二.回顾编码问题:
编码相当于密码本,关系到二进制与看懂的文字的对应关系.
最早期的密码本:
ascii码:只包含英文字母,数字,特殊字符.
0000 0001:
'fjdskal 我发'
字符:组成你看到的内容的最小单位就是字符.
位:二进制中占有的位置,就是位.
字节:8位表示一个字节
对于ASCII码,一个字符是用8位一个字节去表示.
A:01000001
unicode 万国码:将全世界所有的文字都给我汇总到一起.
起初:unicode:
一个字符用16位表示.
A:0000 0000 0000 0010
中:0000 0000 0000 0010
最终unicode:
一个字符用32位表示.
A:0000 0000 0000 0010 0000 0000 0000 0010
中:0000 0000 1000 0010 0000 0000 1000 0010
浪费,占用资源.
utf-8:最少用8位表示一个字符.对unicode升级.
A:01000001
欧洲文字:0000 0000 1000 0010
亚洲文字:0000 0010 0000 0000 1000 0010
gbk:国标码
英文字母:一个字节表示.中文两个字节表示.
A:01000001
中:0000 0000 1000 0010
前提:
文件的存储和传输 不能用unicode编码
除了unicode 剩下的编码方式不能直接识别.
python3x版本.
int
str ----->在内存中用的unicode
bytes类型
list
bool
dict
set
tuple
英文:
str:
表现形式: b1=b'oldboy'
内部编码:非unicode
中文:
str:
表现形式:s='中国'
内部编码:unicode
bytes:
表现形式:b1=b'\xe4\xb8\xad\xe5\x9b\xbd'
内部编码:非unicode
# s = 'oldboy'
# print(s.upper())
# s = '中国'
# b1 = b'oldboy'
# b2 = s.encode('utf-8')
# print(b2)
# print(b1.upper())
# print(b1,type(b1))
# s1 = '老男孩'
# b1 = s1.encode('utf-8') # 编码
# s22 = b1.decode('utf-8') # 解码
# print(s22)
# b2 = s1.encode('gbk') # unicode ---> gbk
# s33 = b2.decode('gbk') # gbk ---> unicode
# print(b1)
# print(b2)
# s1 = 'alex'
# b1 = s1.encode('gbk')
# b2 = b1.decode('utf-8')
# print(b2)
# s1 = '中国'
# b1 = s1.encode('gbk')
# print(b1)
# b2 = b1.decode('gbk').encode('utf-8')
# print(b2)
# s1 = 'zhong'
# b1 = s1.encode('utf-8')
# print(b1)
# print(b1.decode('gbk'))
三.今日内容
递归函数
递归:自己调用自己.
默认递归次数:998
可设置递归次数:
import sys
sys.setrecurecursionlimit(100000)
import sys
sys.setrecursionlimit(100000)
# def func1():
# print(666)
# func1()
# def func():
# print(666)
# func()
# func()
# while True:
# print(666)
#
# 递归到一定次数,就会主动终止. 998
# def func(x):
# x += 1
# print(x)
# func(x)
# n = 0
# func(n)
# 设置递归次数
'''
alex 比 佩奇 大两岁 n = 4
佩奇 比 文周 大两岁 n = 3
文周 比 太白 大两岁 n = 2
太白 26岁 n = 1
'''
def age(n):
if n == 1:
return 26
else:
return age(n-1) + 2
print(age(4)) # age(3) + 2
'''
def age(4):
if n == 1:
return 26
else:
return age(3) + 2
def age(3):
if n == 1:
return 26
else:
return age(2) + 2
def age(2):
if n == 1:
return 26
else:
return age(1) + 2
def age(1):
if n == 1:
return 26
else:
return age(0) + 2
print(age(4))
age(4) = 26 + 2 + 2 + 2
'''
二分查找
算法,最经典最简单的算法.
前提:有序的不重复的数字序列.
# l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
# def index(l,aim):
# count = -1
# for i in l:
# count += 1
# if i == aim:
# return count
# return '没有此值'
# print(index(l,84))
# 第一版 原列表发生改变,导致索引改变.
# l1 = [2, 3, 5, 10, 15, 16, 18, 19]
# def two_find(l,aim):
# mid_index = len(l) // 2
# if aim > l[mid_index]:
# return two_find(l[mid_index+1:],aim)
# elif aim < l[mid_index]:
# return two_find(l[:mid_index], aim)
# elif aim == l[mid_index]:
# return mid_index
# else:
# return None
# print(two_find(l1,18))
# print(two_find(l1,3))
# print(two_find(l1,10))
# 第二版 原列表不发生改变,你的min_index = (end - start) // 2 + start
# l1 = [2, 3, 5, 10, 15, 16, 18]
#
# def two_find(l,aim,start=0,end=None):
# end = len(l) - 1 if end is None else end
# mid_index = (end - start) // 2 + start
# '''
# 第一次: aim:15 start: 0 end: 6 min_index: 3 中间值:10 aim > 10
# 第二次: aim:15 start: 4 end: 6 min_index: 5 中间值:16 aim < 16
# 第三次: aim:15 start: 4 end: 5 min_index: 4 中间值:15 aim = 15
# '''
# if start <= end:
# if aim > l[mid_index]:
# return two_find(l, aim, start=mid_index+1, end=end)
# elif aim < l[mid_index]:
# return two_find(l, aim, start=start, end=mid_index)
# elif aim == l[mid_index]:
# return mid_index
# else:
# return None
# else:
# return None
# print(two_find(l1,15))