1.函数小高级
a = 123
name = "老男孩好"
nums = [11,22,33,4]
data = nums
def func():
pass # 100行代码
# func = 函数
def func():
print(123)
v1 = func
func()
v1()
def func():
print(123)
return 666
func_list = [func, func, func]
func_list[0]()
func_list[1]()
func_list[2]()
for item in func_list:
v = item()
print(v)
def func():
return 123
info = {
'k1': func,
'k2': func()
}
print(info)
def func():
print(123)
def bar():
print(666)
info = {'k1': func, 'k2': bar} # 函数既可以当字典的key 也可以当value 但一般当value
info['k1']()
info['k2']()
def func():
print(123)
func_list1 = [func, func, func] # 函数名当做变量来使用
func_list2 = [func(), func(), func()]
print(func_list1, func_list2)
def func():
return 123
func_list2 = [func(), func(), func()]
print(func_list2)
def func():
return 123
info = {
'k1': func,
'k2': func()
}
print(info)
def func(arg):
print(arg)
func(1)
func([1,2,3,4])
def show():
return 999
func(show) # 打印了show这个函数的地址
1
[1, 2, 3, 4]
<function show at 0x11fd6cea0>
def func(arg):
arg()
def show():
print(666)
func(show)
def func(arg):
v1 = arg()
print(v1)
def show():
print(666)
result = func(show)
print(result)
# 有10个函数
def func():
print("话费查询")
def bar():
print("语音沟通")
def base():
print('xxx')
def show():
print('xxx')
def test():
print('xxx')
# 面试题:输入f1 f2 f3 f4 f5后分别执行以上函数 可以使用if...elif...elif...else但比较麻烦 更简单的方法是将函数作为字典的值
info = {
'f1': func,
'f2': bar,
'f3': base,
'f4': show,
'f5': test
}
choice = input("请选择要选择功能:")
function_name = info.get(choice)
if function_name:
function_name()
else:
print("输入错误")
2.lambda表达式
# lambda表达式,为了解决简单函数的情况,如:
def func1(a1, a2):
return a1 + a1 # 函数内部直接有个return
func2 = lambda a1, a2: a1 + a2
v = func2(1, 2)
print(v)
func1 = lambda : 100
func2 = lambda x1: x1*10
func3 = lambda *args, **kwargs: len(args) + len(kwargs)
v1 = func3(1, 22, 3, k1='hello')
print(v1)
DATA = 100
func4 = lambda a1: a1 + DATA
v = func4(1)
print(v)
DATA = 100
def func():
DATA = 1000
func4 = lambda a1: a1 + DATA
v = func4(1)
print(v)
func()
func5 = lambda n1, n2: n1 if n1 > n2 else n2
v = func5(20, 11)
print(v)
# 练习题1
USER_LIST = []
def func0(x):
v = USER_LIST.append(x)
return v
result = func0('alex')
print(result)
# 练习题2
def func0(x):
v = x.strip()
return v
result = func0(' alex ')
print(result)
############## 总结:列表所有方法基本上都是返回None;字符串的所有方法基本上都是返回新值 #################
# 练习题3
USER_LIST = []
func1 = lambda x: USER_LIST.append(x)
v1 = func1('alex')
print(v1)
print(USER_LIST)
# 练习题4
func1 = lambda x: x.split('l')
v1 = func1('alex')
print(v1)
# 练习题5
func_list = [lambda x:x.strip(), lambda y:y+199,lambda x,y:x+y]
v1 = func_list[0]('alex ')
print(v1)
v2 = func_list[1](100)
print(v2)
v3 = func_list[2](1,2)
print(v3)
3.内置函数
- 3.1 输入输出类
- 3.2 强制转换类
- dict()
- list()
- tuple()
- int()
- str()
- bool()
- set()
- 3.3 数学运算类
- abs() 求绝对值
- float() 转换成浮点型(小数)
- max() 找到最大值
- min() 找到最小值
- sum() 求和
- divmod() 求两个数相除的商和余数
- pow() 幂运算
- round(param1, param2) 四舍五入
- param1是要处理的数
- param2是要保留的小数位数
- 3.4 进制转换相关类
- bin() 将十进制转换为二进制
- oct() 将十进制转换为八进制
- int(param1, param2) 将其他进制转换为十进制
- param1是要转的其他进制的值
- param2说明param1为多少进制,用base=2或8或16等表示
- hex() 将十进制转换为十六进制
- 3.5 编码相关类
- chr() 将十进制数字转换成Unicode编码中的对应字符串
- ord() 将Unicode编码的字符串转换成对应的十进制数
- 应用:随机检验码
v1 = chr(65)
v2 = chr(20013)
v3 = ord('A')
v4 = ord('中')
print(v1, v2, v3, v4) # A 中 65 20013
v = "莱芜技师学院"
for item in v:
data = ord(item)
print(bin(data))
import random # 导入一个模块
def get_random_code(length=6):
data = []
for i in range(length):
v = random.randint(65, 90) # 生成65-90之间的随机数 含65和90
data.append(chr(v))
return "".join(data)
code = get_random_code()
print(code)
- 3.6 特殊需求类
- map(function, iterable)
- function是匿名函数也可以;iterable即可迭代类型(可被for循环)
- 根据提供的function对指定序列做映射
- 以参数序列中的每一个元素调用function,返回每次调用函数获得的返回值组成的新列表(Python2)或迭代器(Python3)
v1 = [11, 22, 33, 44]
def func(arg):
return arg + 100
result = map(func, v1)
print(list(result))
result = map(lambda x: x + 100, v1)
print(result) # python2会返回[111, 122, 133, 144]
print(result) # python3会返回一个对象 不立即展示 可以节省内存
print(list(result))
print(v1) # 循环v1但不影响v1
- filter(function or None, iterable)
- function的作用是对iterable中的每个元素判断是否符合特定条件;None不调用任何函数,只对可迭代对象中的元素本身判断真假,保留为真的元素
- 根据特定条件过滤迭代器中不符合条件的元素
- 需要用list函数进行转换,才能得到符合的条件元素组成的新列表
v1 = [11, 22, 33, 'asd', 44, 'xf']
def func(x):
if type(x) == int:
return True
return False
result = filter(func, v1) # [] 返回结果为True的会加到空列表中 False的不加
print(list(result))
li = ["", 0, None, 11, 'h', {'k1', 'v1'}]
result = filter(None, li)
list(result)
v1 = [11, 22, 33, 'asd', 44, 'xf'] # 找到列表中的所有数字
result = filter(lambda x: type(x) == int, v1)
print(list(result))
- reduce(function, sequence)
- function是要应用于序列的二元(接收2个参数)操作函数;要归约的序列,如列表、元组
- 使用前要 import functools
- 将一个二元操作的函数应用于序列的元素,以将序列归一为单一的值
v1 = [1, 2, 3, 4, 5, 6]
def func(x, y):
return x + y
# result = functools.reduce(func,v1)
result = functools.reduce(lambda x, y: x+y, v1)
print(result)
v1 = ['wo', 'hao', 'e']
def func(x, y):
return x + y
result = functools.reduce(func,v1)
print(result)
- 3.7 其他类
- len()
- open()
- range()
- id()
- type()
4.两个题目
total_count = len(USER_LIST) # 总条数
per_page_count = 10 # 每一页有多少条
max_page_num, a = divmod(total_count, per_page_count)
if a > 0:
max_page_num += 1
pager = int(input("请输入页码:"))
if pager < 1 or pager > max_page_num:
print("输入错误")
else:
start = (pager - 1) * per_page_count;
end = pager * per_page_count
data = USER_LIST[start: end]
for item in data:
print(item)
- 4.2 面试题:将点分十进制的IP地址转为32bit的二进制,再将它转为十进制数
#面试题 给定IP地址 192.168.12.79 要求将所有十进制数转为8bit的二进制01串 然后连接4组8bit的01串 最后将其转为十进制数
ip = "192.168.12.79"
ip_list = []
for item in ip.split("."):
# ip_list.append(bin(int(item)))
data = bin(int(item))[2:]
# ip_list.append(data)
if len(data) < 8:
zero_num = 8 - len(data)
data = zero_num * '0' + data
ip_list.append(data)
result = "".join(ip_list)
# print(result, len(result))
print(int(result, base=2))
5.函数中高级
def func():
print(123)
def bar():
return func
v = bar()
v()
name = "oldboy"
def func():
print(name)
def bar():
return func
v = bar()
v()
def bar():
def inner():
print(123)
return inner
v = bar()
v()
name = "oldboy"
def bar():
name = "alex"
def inner():
print(name)
return inner
v = bar() # bar()执行后,v指向了inner,由于inner被v用着,所以bar的空间不会被销毁
v()
name = "oldboy"
def bar(name):
def inner():
print(name)
return inner
v1 = bar("alex") # 内存空间1 name = "alex" inner # 闭包,为函数创建一块区域(用户变量供自己使用) 保留它的数据 方便以后使用
v2 = bar("eric") # 内存空间2 name = "eric" inner
v1()
v2()
# 练习题
name = "alex"
def base():
print(name)
def func():
name = "eric"
base()
func()
name = "alex"
def func():
name = "eric"
def base():
print(name)
base()
func()
name = "alex"
def func():
name = "eric"
def base():
print(name)
return base
base = func()
base()
info = []
def func():
print(item)
for item in range(10):
info.append(func)
info[0]()
info = []
def func(i):
def inner():
print(i)
return inner
for item in range(10):
info.append(func(item))
info[0]()
info[1]()
info[4]()
- 5.2 闭包
- 概念:为函数创建一块区域并为其维护自己的数据,以后执行时方便调用。
- 应用场景:装饰器 SQLAlchemy源码
def func(name):
def inner():
print(name)
return inner
v1 = func("alex")
v1()
v2 = func('eric')
v2()
- 5.3 高阶函数
- 对函数进行赋值
- 把函数当做参数传递
- 把函数当做返回值
6.模块
- 6.1 相关方法
- md5() 创建md5对象
- update() 将输入数据加密成散列值
- hexdigest() 以十六进制的形式获取散列值
- 6.2 将指定的“字符串”进行加密
import hashlib
def get_md5(data):
obj = hashlib.md5()
obj.update(data.encode('utf-8'))
result = obj.hexdigest()
return result
val = get_md5('123')
print(val)
import hashlib
USER_LIST = []
def get_md5(data):
obj = hashlib.md5("djkslerwqi8r324c834cb3n434cafjld".encode('utf-8'))
obj.update(data.encode('utf-8'))
result = obj.hexdigest()
return result
val = get_md5('123')
print(val)
# 网站:cmd5.com
# 应用1 账户注册与登录
USER_LIST = []
def register():
print("*************用户注册*************")
while True:
user = input("请输入用户名:")
if user == 'N':
return
pwd = input("请输入密码:")
temp = {'username': user, 'password': get_md5(pwd)}
USER_LIST.append(temp)
def login():
print("*************用户登录*************")
user = input("请输入用户名:")
pwd = input("请输入密码:")
for item in USER_LIST:
if item['username'] == user and item['password'] == get_md5(pwd):
return True
register()
result = login()
if result:
print('登录成功')
else:
print('登录失败')
# 应用2 密码以“·”隐藏显示
import getpass
pwd = getpass.getpass("请输入密码:")
print(pwd)