Python之内置函数二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/11 9:01
# @Author : Ropon
# @File : 15_01.py

# lambda #匿名函数
# 为了解决简单需求而设计一句话函数
# 比如计算n的n次幂
# def func(n):
# return n**n
# print(func(2))
#
# f = lambda n: n**n
# print(f(2))
# 语法:函数名 = lambda 参数: 返回值
# 1、函数的参数可以多个,多个参数用逗号隔开
# 2、匿名函数不管复杂程度,只能写一行,且逻辑结束后直接返回数据
# 3、返回值和正常函数一样,可以是任意数据类型
# 匿名函数并不是说一定没有名字,前面的变量就是函数名,说他是匿名函数是因为通过__name__查看没有名字,所以统称为lambda

# sorted() #排序函数
# 语法:sorted(iterable, key=None, reverse=False)
# iterable:可迭代对象
# key:排序规则或排序函数,在sorted内部会将可迭代对象中每一个元素传给这个函数的参数,根据函数运算结果进行排序
# reversed:是否倒序,True:倒序,False:正序

# lst = [7, 3, 2, 5, 4]
# lst1 = sorted(lst)
# print(lst)
# print(lst1)

# dic = {1: 'A', 2: 'B'}
# print(sorted(dic)) #字典排序,返回排序后的key

# def func(s):
# return len(s)
#
# lst = ["测试", "再次测试", "字符长度是多少", "我"]
# print(sorted(lst, key=func))
# print(sorted(lst, key=lambda s: len(s)))

# lst = [{"id": 1, "name": 'ropon', "age": 20},
# {"id": 2, "name": 'luo', "age": 16},
# {"id": 3, "name": 'peng', "age": 18}]
# print(sorted(lst, key=lambda e: e['age'], reverse=True)) #按年龄排序

# filter() #筛选函数
# 语法:filter(function ,iterable)
# function:用来筛选的函数,在filter中会自动将iterable对象中元素传递给function
# 然后根据function返回的True或False判断是否保留此项数据
# iterable:可迭代对象
#返回迭代器

# lst = [1, 2, 3, 4, 5, 6, 7, 8]
# ll = filter(lambda x: x%2==0, lst)
# print(list(ll))

# lst = [{"id": 1, "name": 'ropon', "age": 20},
# {"id": 2, "name": 'luo', "age": 16},
# {"id": 3, "name": 'peng', "age": 18}]
#
# ll = filter(lambda e: e['age'] > 16, lst) #筛选年龄大于16
# print(list(ll))

# map() #映射函数
# 语法:map(function ,iterable)
# function:对可迭代对象每一个元素进行映射,分别取出来执行function
# iterable:可迭代对象
#返回迭代器

# def func(e):
# return e*e
#
# mp = map(func, [1, 2, 3, 4, 5])
# print(mp)
# print(list(mp))

# print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))

# 计算2个列表相同位置的值之和
# lst1 = [1, 2, 3, 4, 5]
# lst2 = [2, 4, 6, 8, 10]
# print(list(map(lambda x, y: x + y, lst1, lst2)))

# 递归
# 在函数中调用函数本身,就是递归。

# 一直输出hello world
# 在python中递归最大深度为998
# def func():
# print("hello world")
# func()
# func()

# def func(n):
# print(n)
# n += 1
# func(n)
# func(1)

#递归应用
# 一般使用递归遍历各种树形结构,比如文件系统

# import os
#
# def readdir(filepath, n):
# files = os.listdir(filepath) #获取当前文件夹中所有文件及文件夹
# for fi in files: #遍历本层所有文件夹及文件
# # print(fi)
# fi_d = os.path.join(filepath, fi) #以/拼接路径
# if os.path.isdir(fi_d): #如果是文件夹,就输出,递归编译文件夹,否则结束递归,输出文件
# print("\t"*n, fi_d)
# readdir(fi_d, n+1)
# else:
# print("\t"*n, fi_d)
#
# readdir("D:\Ropon\Seafile\Work\python\code" , 0)

# 二分查找
# 每次查找都能排查一半的数据,效率高,但局限性大,必须是有序的序列才能使用二分查找

#判断n是否在lst列表中,若在返回其位置
#非递归算法,使用二分查找
# lst = [22, 33, 44, 55, 66, 77, 88, 99, 345, 444, 567, 789, 555]
# n = 567
# left = 0
# right = len(lst) - 1
# count = 1
# while left <= right:
# middle = (left + right) // 2
# if n < lst[middle]:
# right = middle - 1
# elif n > lst[middle]:
# left = middle + 1
# else:
# print(count)
# print(middle)
# break
# count += 1
# else:
# print("不存在")

# lst = [22, 33, 44, 55, 66, 77, 88, 99, 345, 444, 567, 789, 555]

#递归二分法
# def binary_search(n, left, right):
# if left <= right:
# middle = (left + right) // 2
# if n < lst[middle]:
# right = middle - 1
# elif n > lst[middle]:
# left = middle + 1
# else:
# return middle
# return binary_search(n, left, right)
# else:
# return -1
#
# print(binary_search(567, 0, len(lst) - 1))