# 全局变量 局部变量 全局变量应当大写 name = "hm" def chang_name(): # globals name # 更改全局 # 优先读取局部变量 其次读取全局 name = "st" # 声明全局变量不能在局部变量之后 # name.append(" st") print(name) chang_name() print(name) # 未改变name 局部无法更改全局 无法重新赋值 可以调用函数 # nonlocal 上一级变量 嵌套函数 # 递归 必须有一个明确的结束条件 def calc(count): if count: return count+calc(count-1) else: return 0 print(calc(10)) # 太深则报错 效率不高(保存当前状态) 占用内存 import time time.sleep(0.1) # pause print("*"*20) # 函数返回 def cal1(): pass print(cal1) # 打印内存地址 # print(call()) # 不可执行 def cal2(): def nar(): print("nar") return nar # 返回函数地址 v = cal2() v() # 直接调用内层 cal2()() # lambda 匿名函数 def cal1(x): return x+1 # 等价于 cal2 = lambda x:x+1 # lambda x:x+1 函数地址 print(cal2(1)) # lambda没有保存会自动销毁 # lambda不应当独自存在 # 编程方法论:面向过程 函数式 面向对象 # 函数式:高阶函数 无变量赋值 一步到位或者递归 将函数作为参数 返回函数地址 # 尾调用 函数的最后一步调用其他函数 return cal1(10)+1 不属于尾调用 先调用再求值 # map num = [1, 2, 3, 4, 5, 6, 7] def add_num(x): return x+1 def reduce_num(x): return x-1 def pf_num(x): return x**2 def map1(func, num): ret = [] for i in num: ret.append(func(i)) return ret print(map1(add_num, num)) # 函数式编程 print(map1(lambda x:x+1, num)) print(map(lambda x:x+1, num)) # 可以传有名函数 和其他 可迭代对象 res = map(lambda x:x+1, num) for i in res: # 迭代器 迭代一次后在最后 print(i) print(list(res)) res = map(lambda x:x+1, num) print(list(res)) # python2 中直接生成列表 # filter movie_people = ["sb_A", "sb_B", "C", "sb_D"] def sb_s(str1): return str1.startswith('sb') # endswith in def filter1(check, array): ret = [] for p in array: if not check(p): ret.append(p) return ret print(filter1(sb_s, movie_people)) print(list(filter(lambda str1:not str1.startswith('sb'), movie_people))) # reduce num = [1, 2, 3,] def de(res, i): return res * i def reduce1(de, num, checknum = None): if checknum: res = checknum else: res = 1 for i in num: res = de(res, i) return res print(reduce1(de, num)) print(reduce1(lambda res, i: res*i, num)) # reduce 需要导入 from functools import reduce print(reduce(lambda res, i: res*i, num)) # 第三个参数初始值 可有可无 # 内置函数 abs(-1) # 绝对值 all([]) # 将列表中所有元素进行bool运算 所有的为真 为真 空 也为真 any([1, 2, 3, 0]) # 一个为真则为真 name = "hm" # bytes(name,encoding='utf-8') # 手动转为二进制编码 返回字符串 # bytes(name,encoding='utf-8').decode('utf-8') # 解码 编码解码必须对应 # ascill码不能编中文 chr(49) # 转换为字符 ord 转换为ascill dir(dict) # 打印某一对象下有哪些方法 print(dir(all)) divmod(10, 3) # 分页 共10条 每页三条 dic = {"k1":1, "k2":2} dic_str = str(dic) # 转换为 字符串 eval(dic_str) # 提出字符串中的字典 ex = "1+2*3/2" eval(ex) # 完成字符串中的 数据运算 # 可hash的数据类型为 不可变数据类型 hash("12345678") # 得到hash值 hash值长度固定 与参数无关 # hash值不可反推得到原始数据 # 不同内容hash值不同 # 应用1 木马更改程序检测 print(help(all)) # 帮助 打印使用方法 bin(10) # 十进制转二进制 # hex 十进制转十六进制 oct 十进制转八进制 isinstance(1, int) # 判断数据类型 isinstance({}, dict) name = "123" globals() # 返回所有全局变量 __file__ 当前路劲 locals() # 打印当前级别 print(list(zip(("a","b","c"),(1, 2, 3)))) # 一一对应 形成元组 多余的舍弃 dic1 = {"k1":18, "k2":"name"} # 参数为序列 列表 元组 字符串 字典 集合 print(list(zip(dic1.keys(), dic1.values()))) max([1,2,3,4]) # 取最大值 min() 取最小值 # 奇技淫巧 dic2 = {"k1":18, "k2":30, "k4": 10, "k3":1} # 找出最大的 键值对 print(zip(dic2.values(), dic2.keys())) tp1 = zip(dic2.values(), dic2.keys()) # 返回地址 可迭代 print(list(max(tp1))) # 依次比较 从第一个元素开始比较 # 元素为字典时 字典间不能比较 无法遍历内部元素 处理方法 dic3 = [ {"name":"hm", "age":18}, {"name":"st", "age":17}, {"name":"yh", "age":19} ] max(dic3, key=lambda dic4:dic4["name"]) pow(3, 3) # 3次方 pow(3, 3, 2) # 3 ** 3 % 2 # repr 终端中输入即可打印 调用了repr() # print 调用str() # reversed 反转 # round 四舍五入 # set 集合 li = "hello" li1 = li[2:4] li2 = slice(2, 4) # 切片 第三个参数 限定长度 print(li[li2]) # 使用方法 print(li2.start) print(li2.stop) # 切片的开始结束 # sorted() 从小到大排序 混合类型不能排序 第一个参数 需要排的数据 sorted(dic3, key=lambda dic4:dic4["name"]) dic4 = {"k1":200, "k2":300, "k3":500} print(sorted(dic4, key=lambda key:-dic4[key])) # 由大到小 # type() 查看数据类型 if type(对象) is 类型: # range(100) 0-100 # range(10, 100) 10-100 左闭右开 # locals 打印当前级别变量 字典格式 # vars 无参时等价locals 有参 查看所有方法 import time # import 导入模块 文件名 time.py # 工作名 字符串 # module_name = "str" # __import__(module_name) # import 会转换成 __import__