Python基础5

1.函数小高级

  • 函数执行的流程分析(函数到底是哪个区域创建的)
a = 123
name = "老男孩好"
nums = [11,22,33,4]
data = nums

def func():
    pass # 100行代码

# func = 函数
  • 1.1 函数名当做变量来使用
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)
  • 1.2 函数可以当做参数进行传递
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表达式

  • 2.1 作用
    • 用于表示简单的函数
  • 2.2 格式
# 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)
  • 2.3 练习
# 练习题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 输入输出类
    • print()
    • input()
  • 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.两个题目

  • 4.1 分页问题
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.函数中高级

  • 5.1 函数可以做返回值
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)
  • 6.3 加盐
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
  • 6.4 应用
# 应用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)
posted @ 2025-01-19 14:46  pycoder_666  阅读(19)  评论(0)    收藏  举报