day11recursion/module/tireator/g
recursion
了解
1.什么是递归函数
函数中调用函数本身的函数就是递归函数
-
递归的作用:循环能做的事情递归函数都能做
-
怎么写递归函数 f(n)
第一步:确定临界值 - 循环结束的条件,在临界值的地方要让函数结束
第二步:找关系 - 找当次循环和上次循环的关系;找f(n)和f(n-1)的关系
第三步:假设函数的功能已经实现,通过f(n-1)来实现f(n)的功能
1+2+3+4+...n
def fun(n):
if n == 1:
return 1
return fun(n-1)+n
print(fun(100))
写⼀一个函数,可以对多个数进⾏行行不不同的运算
例如: operation('+', 1, 2, 3) ---> 求 1+2+3的结果 operation('-', 10, 9) ---> 求 10-9的结果 operation('', 2, 4, 8, 10) ---> 求 24810的结构
def opreation(char:str,*nums):
# 对多个数进行不同的运算,通过下标用第一个元素对后边的元素依次进行运算
num = nums[0]
for index in range(1,len(nums)):
if char == '+':
return sum(nums)
elif char == '-':
num -= nums[index]
elif char == '*':
num *= nums[index]
elif char == '':
return ''.join(str(nums))
return num
print(opreation('',5,3,6))
练习:求数列第n个数
1,1,2,3,5,8,13....
def sequence(n):
if n == 1or n == 2:
return 1
# f(n) = f(n-1) + f(n-2)
return sequence(n-1) +sequence(n-2)
print(sequence(5))
- 循环能做的事情不能使用递归做!
module
'''模块'''
- 什么是模块
在Python在,一个py文件就是一个模块
系统模块(标准库) - Python系统提供的模块(使用的时候直接导入)
random 模块 - 提供随机数
math 模块 - 提供数学运算
json 库 - 提供json数据相关操作
re 模块 - 提供正则表达式相关操作
socket 模块 - 提供Python套接字编程
time模块 - 提供和时间相关的操作
threading 模块 - 提供和线程相关的操作
- 自定义模块 - 程序员自己创建的py文件
- 自己写的模块:
- 别人写的模块:第三方库 (需要先下载到解释器中,然后才能在代码中导入)
标准库和第三方库一般是通过模块提供变量、函数、类
-
怎么使用模块
a. import 模块名 --> 直接导入指定的模块,导入后可以使用模块中所有的全局变量(包含了变量,函数和类)
导入后通过 '模块名.变量' 来使用模块中的内容
b. from 模块名 import 变量1 - 在程序中导入指定的模块,导入后只能使用import后面的变量
导入后直接使用变量,不用再前面加‘模块名 .’
from 模块名 inport * 可以直接使用里面所有的全局变量
导入后直接使用变量,不用再前面加‘模块名 .’ -
导入模块的实质:
a. 不管是使用import还是from- import,导入模块的时候都会执行模块中所有的代码
b. Python中一个模块不会重复导入多次。因为导入的时候系统会自动检测当前模块是否导入 -
怎么阻止模块中的内容被其他模块执行
写在这个if语句中的代码不会被别的模块执行
if nama == 'main':
将不希望其他模块执行的代码放在 if nama == 'main': 语句中
如果希望被其他模块使用的代码就放在if nama == 'main': 语句的外面
原理:
每个模块都有一个属性 name属性,代表模块名。默认情况下它的值是py文件的文件名,
当当前模块正在被执行(直接执行)的时候,模块属性name 的值就会变成 main
- 重命名
导入模块的时候可以对模块或者模块中的内容重新命名
import 模块名 as 新模块名
from 模块名 import 变量 as 新变量
系统模块
import random
print(random.randint(10,100))
import math
import json
import re
import socket
import time
time.localtime()
print(time.localtime())
import threading
iter
- 什么是迭代去(iter)
Python 提供的容器性数据类型。
获取迭代器中的元素的时候只能从前往后一个一个的取,而且取了之后这个元素在迭代器中就不存在了
- 迭代器的字面量
迭代器没有指定格式的字面量。迭代器作为荣区,里面的元素只能通过其他序列转换,或者通过生成器生成
迭代器中的元素可以是任何类型的数据
将字符串转换成迭代器,迭代器中的元素就是字符串中的每个字符
iter1 = iter('hello')
print(iter1)
- 获取元素
迭代器中的元素只支持查 ,不支持增删改
迭代器只能通过next函数获取单个元素,通过 for in 遍历一个一个获取所有元素;
不管是哪种方式获取,已经获取过的元素,在迭代器中就不存在了
iter3 = iter('hello')
- next(迭代器) 获取迭代器中最新的数据 --> (最顶层)
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(next(iter3))
print('===========')
- for in 遍历 通过for in 取迭代器中的元素和net效果一样,元素还是会从迭代器中取出
iter1 = iter('123456')
print(next(iter1))
for x in iter1:
print('x:',x)
练习:看打印效果
iter2 = iter([552,'sdfs',(5221,5421)])
print(iter2)
generator
-
什么是生成器
生成器就是迭代器,迭代器不一定是生成器 -
生成器怎么产生元素
调用一个带有yield关键字的函数就能得到一个生成器
不带yield的函数:调用的时候会执行函数体,并且获取返回值
带yield的函数:调用的时候不会执行函数体,也不会获取返回值,而会产生一个新的生成器(函数调用表达式就是一个生成器)
这个生成器中的元素就是yield关键字后面的值
def func1():
print('===')
return 100
print(func1())
def func2():
print('=====')
return 100
yield # 函数体没有执行
print(func2()) # <generator object func2 at 0x00705F30>
- 生成器的元素
生成器中的元素也是通过next 或者 for in
生成器获取元素,实质就是去执行生成器对应的函数,每次都是执行到yield语句为止,并且会将yield后面的值作为获取到的元素
下次获取元素的时候会接着上次结束的位置往后执行,直到下一个yield为止...
知道函数结束。如果执行到函数结束没有遇到yield那么就会报错 异
print('============')
def func3():
print('!!!!!!!!')
yield 'abc',200
print('**********')
yield 200
gen1 = func3() # gen1就是一个生成器(生成器就是迭代器)
print(gen1)
print(next(gen1))
print('第一次结束')
print(next(gen1))
学号
def func4():
num = 1
while True:
yield 'py1809%d' % num
num += 1
gen1 =func4()
students = []
for _ in range(10):
students.append(next(gen1))
print(students)
print('上了两天的课')
students.append(next(gen1))
print(students)
students.pop(2)
print(students)
students.append(next(gen1))
print(students)