day16 内置函数和匿名函数

#python里有哪些数据类型:int、bool、str、list、tuple、dict、set
#Python里有哪些数据结构:dic、list、tuple、set、str
#reversed():反转
l = [1,2,3,4,5]
l2 = reversed(l)
print(l2) #输出结果为<list_reverseiterator object at 0x00349070>
#保留原列表,返回一个反向的迭代器
#slice:切片
l = (1,2,23,213,5612,342,43)
sli = slice(1,5,2)
print(l[sli]) #等同于l[1:5:2]
#formate
'''
#字符串可以提供的参数,指定对齐方式,<是左对齐, >是右对齐,^是居中对齐
print(format('test', '<20'))
print(format('test', '>20'))
print(format('test', '^20'))

#整形数值可以提供的参数有 'b' 'c' 'd' 'o' 'x' 'X' 'n' None
>>> format(3,'b') #转换成二进制
'11'
>>> format(97,'c') #转换unicode成字符
'a'
>>> format(11,'d') #转换成10进制
'11'
>>> format(11,'o') #转换成8进制
'13'
>>> format(11,'x') #转换成16进制 小写字母表示
'b'
>>> format(11,'X') #转换成16进制 大写字母表示
'B'
>>> format(11,'n') #和d一样
'11'
>>> format(11) #默认和d一样
'11'
'''
#bytes
ret = bytearray('alex',encoding='utf-8')
print(id(ret))
print(ret[0])
ret[0] = 65
print(ret)
print(id(ret))

print(bytes('你好',encoding="GBK").decode('GBK')) #Unicode转换成GBK的bytes
print(bytes('你好',encoding='utf-8')) #unicode转换成utf-8的bytes

#网络编程 只能传二进制
#照片和视频也是以二进制储存
#HTML网页爬取到的也是源码
#bytearray
b_array = bytearray('你好',encoding='utf-8')
print(b_array)
print(b_array[0])

#memoryview
ret = memoryview(bytes('你好',encoding='utf-8'))
print(len(ret))
print(bytes(ret[:3]).decode('utf-8'))
print(bytes(ret[3:]).decode('utf-8'))
#切片 ---字节类型 不占内存
#字节 ---字符串 占内存
#ord:字符按照Unicode转换数字
print(ord('a'))
print(ord('l'))
#chr:数字按照Unicode转换字符
print(chr(97))
#ascii
print(ascii('好'))
print(ascii(1))
#repr:用%r格式化输出
name = 'egg'
print('你好%r'%name)
print(repr('l'))

#all 其中只要有一个False其结果就是false,全部都为True时才为True
print(all(['a','',123]))
print(all(['a',123]))
print(all([0,123]))
#运行结果
'''False
True
False'''
#any 其中只要有一个是True,其结果就是True,否则为False
print(any(['a','',123]))
print(any(['a',123]))
print(any([0,'']))
#运行结果
'''
True
True
False
'''

#zip 拉链方法
l = [1,2,3]
l2 = ['a','b','c','d']
l3 = ('*','**',[1,2])
d = {'k1':1,"k2":2} #字典使用zip只能将key拉上
for i in zip(l,l2,l3,d):
print(i)
#filter过滤方法,过滤函数
l1 = [1, 4, 6, 7, 9, 12, 17]
l2 = [1, 4,'haha', 6,'yzx',None,[],'', 7, 9, 12, 17]
def is_odd(x):
return x % 2 == 1
def is_str(s):
return s and str(s).strip()
ret = filter(is_odd,l1) #返回一个迭代器,等同于[i for i in range(l1) if i % 2 == 1]
for i in ret:
print(i)
res = filter(is_str,l2) #过滤字符串
for j in res:
print(j)

from math import sqrt
print(sqrt(64))
#法1
def func(num):
res = sqrt(num)
return res % 1 == 0
ret = filter(func,range(1,101))
for i in ret:
print(i)
import math
#法二
def is_sqr(x):
return math.sqrt(x) % 1 == 0
print(list(filter(is_sqr, range(1, 101))))

#map
ret = map(abs,[1,-4,6,8])
print(ret)
for i in ret:
print(i)

#总结filter、map
#filter:执行了filter之后的结果集合 <=执行之前的个数
#filter只管筛选,不会改变原来的值
#map 执行前后元素个数不变
#值可能发生改变

#sorted
l = [1,-4,6,5,-10]
l.sort(key=abs) #sort在原列表的基础上进行排序
print(l)
#运行结果
#[1, -4, 5, 6, -10]
print(sorted(l)) # sorted是生成一个新列表,不改变原列表,缺点是占内存
print(l)
#运行结果
'''
[-10, -4, 1, 5, 6]
[1, -4, 5, 6, -10]'''

#列表按照每一个元素的len排序
l = [[1,2],[3,4,5,6],(7,),'123']
print(sorted(l,key=len))

#匿名函数
'''
函数名 = lambda 参数 :返回值

#参数可以有多个,用逗号隔开
#匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
#返回值和正常的函数一样可以是任意数据类型
'''
calc = lambda n:n**n
print(calc(10))

def add(x,y):
return x+y
#上面add函数转换为匿名函数如下:
add = lambda x,y:x+y
print(add(10,10))

l=[3,2,100,999,213,1111,31121,333]
print(max(l))

dic={'k1':10,'k2':100,'k3':30}

print(max(dic))
print(dic[max(dic,key=lambda k:dic[k])]) #max排序排的时字典中的key

#从lambda函数转换为函数
#lambda函数
res = filter(lambda x:x>10,[5,8,11,9,15])
for i in res:
print(i)
#普通函数
def func(x):
return x>10
res = filter(func,[5,8,11,9,15])
for i in res:
print(i)

#面试题练一练
#1.下面程序的输出结果是:4096
d = lambda p:p*2
t = lambda p:p*3
x = 2
x = d(x)
x = t(x)
x = d(x)
print(x)
#运行结果:24
#2.现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
#解题思路:匿名函数 == 内置函数(max,min,sorted,filter,map)
ret = zip((('a'),('b')),(('c'),('d')))
# def func(tup):
# return {tup[0]:tup[1]}
res = map(lambda tup:{tup[0]:tup[1]},ret)
print(list(res))
#3.以下代码的输出是什么?请给出答案并解释。
def multipliers():
return (lambda x:i*x for i in range(4))
print([m(2) for m in multipliers()])
#请修改multipliers的定义来产生期望的结果。

def story():
s = """
从前有个山,山里有座庙,庙里老和尚讲故事,
讲的什么呢?
"""
print(s)
story()

story()
import sys
print(sys.setrecursionlimit(100000))
def foo(n):
print(n)
n += 1
foo(n)
foo(1)

def age(n):
if n == 1:
return 40
else:
return age(n-1)+2

print(age(4))


原文地址:https://www.cnblogs.com/Murraya/p/10822216.html