今日内容:
1、函数递归调用
2、小案例:二分法
3、三元表达式、匿名函数
4、模块
import
from ... import ...
# 函数递归调用
'''
# 一:引入
# 函数的递归调用:就是在调用一个函数的过程中又直接或间接地调用自己
# 示例1:直接调用自己
# def foo():
# print('hello')
# foo()
#
# foo()
# 示例2:间接调用自己
# def bar():
# print('from bar')
# foo()
#
# def foo():
# print('hello')
# bar()
#
# foo()
# 为何死递归会抛出异常?
# 因为无限的递归会导致内存溢出,所以python设定了最大的递归层数
# 所以不应该无限递归调用下去,应该在满足某种条件下结束递归调用,然后返回
# import sys
# print(sys.getrecursionlimit()) # 查看python中内置的最大递归深度
# print(sys.setrecursionlimit(2000)) # 修改内置最大递归深度
# 二:递归调用应该分为两个阶段
# 1、回溯(往深入):一层一层地递归调用下去
# 2、递推(往外出):在满足某一条件的情况下结束回溯,然后开始向上一层层返回
# salary(5) = salary(4) + 10
# salary(4) = salary(3) + 10
# salary(3) = salary(2) + 10
# salary(2) = salary(1) + 10
# salary(1) = 18
# n=1 salary(n) = 18
# n!=1 salary(n) = salary(n-1) + 10
# 实现:
# def salary(n):
# if n == 1:
# return 18
# return salary(n-1) + 10
#
# print(salary(5))
# 取出列表中所有数字
# nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]
# def func(l):
# for x in l:
# if type(x) is list:
# # 把自身的代码重新再调用一次
# func(x)
# else:
# print(x)
# func(nums)
# 三、二分法
# 从小到大排列的一个数字列表
# nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
# def search(l, find_num):
# mid_num = len(l) // 2
# print(l)
# if len(l) == 0:
# print('不存在')
# return
# elif find_num > l[mid_num]:
# right_l = l[mid_num + 1:]
# search(right_l, find_num)
# elif find_num < l[mid_num]:
# left_l = l[:mid_num]
# search(left_l, find_num)
# else:
# print('find it')
#
# search(nums,18)
'''
# 三元表达式
'''
# 三元表达式:表达式1 + if条件 + else + 表达式2
# x = 111
# y = 222
# s = x if x > y else y
# print(s)
'''
# 匿名函数 lambda
'''
# 匿名函数即没有名字的函数
# res=(lambda x, y : x + y)(1,2)
# print(res)
# salary = {
# 'a': 11,
# 'b': 22,
# 'c': 33
# }
# def func(k):
# return salary[k]
# print(max(salary, key=func))
# print(max(salary, key=lambda k: salary[k]))
# print(min(salary, key=lambda k: salary[k]))
# print(sorted(salary, key=lambda k: salary[k], reverse=True))
'''
# 模块
'''
# 1、什么是模块
# 模块就是一个功能的集合体,不是用来直接运行,而是用来被导入使用的
#
# 模块分为三大来源:
# 1、内置的模块
# 2、第三方模块
# 3、自定义的模块
#
# 模块分为四种类别:
# 1、一个py文件就是一个模块
# 2、一个文件夹也是一个模块-->包
# 3、已被编译为共享库或DLL的C或C++扩展
# 4、使用C编写并链接到python解释器的内置模块
#
# 2、为何要用模块
# 使用别人的模块:
# 1、拿来主义,提升开发效率
# 自定义模块:
# 1、别人的功能不够用了,需要自己去编写
# 2、解决代码冗余
#
# 3、如何用模块
# 文件名是spam.py,模块名则是spam
# import spam
# 首次导入模块发生的事
# 1、产生一个模块的名称空间,触发被导入的模块的运行,把模块中的名字都放进去
# 2、会在当前执行文件中得到一个名字spam,该名字是指向被导入模块的名称空间的
# 之后的导入,名字spam直接引用首次导入产生的名称空间,不会再执行模块内的代码了
# import spam
# import spam
# import spam
# money = 2000
# def read1():
# print('7.23')
# print(money)
# print(spam.money)
# read1()
# spam.read1()
# spam.change()
# print(spam.money)
# 一行导入多个模块
# import spam,m1,m2,m3 # 不推荐
# 为导入的模块起别名
# import spamasdfasfsadfadfasfd as m
# m.xxx
# 示例:
# #mysql.py
# def sqlparse():
# print('from mysql sqlparse')
# #oracle.py
# def sqlparse():
# print('from oracle sqlparse')
#
# #test.py
# db_type=input('>>: ')
# if db_type == 'mysql':
# import mysql as db
# elif db_type == 'oracle':
# import oracle as db
#
# db.sqlparse()
# from ... import ... # 容易发生变量名冲突,不推荐
# 文件名是spam.py,模块名则是spam
# from spam import money,read1,read2 # 相当于money=spam.money,read1=spam.read1,read2=spam.read2
# 首次导入模块发生的事情
# 1、产生一个模块的名称空间,触发被导入的模块的运行,把模块中的名字都放进去
# 2、会在当前执行文件中得到名字
# money=模块spam中的money对应值的内存地址
# read1=模块spam中的read1对应值的内存地址
# read2=模块spam中的read2对应值的内存地址
# print(money)
# print(read1)
# print(read2)
#
# money=111
# print(money)
#
# money=2000
# read1()
# def read1():
# print('run.py read1')
# read2()
# 一行导入多个名字
# from spam import money,read1
# 为导入的模块起别名
# from spam import money as m
# print(m)
# '*' 可用来导入模块中所有名字,可在被导入模块中用__all__来限定导入的名字
# (例:在被导入模块中开头写上__all__ = ['money', 'read1'])
# from spam import *
# print(money)
# print(read1)
# print(read2) # 报错
# print(change) # 报错
'''