python基础复习(三)
一、三元表达式
三元表达式:
name = input('姓名')
res = '你好' if name == '闫' else '您好'
print(res)
列表推导式:
#1、示例
egg_list=[]
for i in range(10):
egg_list.append('鸡蛋%s' %i)
egg_list=['鸡蛋%s' %i for i in range(10)]
#2、语法
[expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN
]
类似于
res=[]
for item1 in iterable1:
if condition1:
for item2 in iterable2:
if condition2
...
for itemN in iterableN:
if conditionN:
res.append(expression)
#3、优点:方便,改变了编程习惯,可称之为声明式编程
生成器表达式:
#1、把列表推导式的[]换成()就是生成器表达式
#2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性
>>> chicken=('鸡蛋%s' %i for i in range(5))
>>> chicken
<generator object <genexpr> at 0x10143f200>
>>> next(chicken)
'鸡蛋0'
>>> list(chicken) #因chicken可迭代,因而可以转成列表
['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',]
#3、优点:省内存,一次只产生一个值在内存中
递归与二分法:
递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
#直接调用本身
def f1():
print('from f1')
f1()
f1()
#间接调用本身
def f1():
print('from f1')
f2()
def f2():
print('from f2')
f1()
f1()
# 调用函数会产生局部的名称空间,占用内存,因为上述这种调用会无需调用本身,python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用做了最大的层级限制
四 可以修改递归最大深度
import sys
sys.getrecursionlimit()
sys.setrecursionlimit(2000)
def f1(n):
print('from f1',n)
f1(n+1)
f1(1)
虽然可以设置,但是因为不是尾递归,仍然要保存栈,内存大小一定,不可能无限递归,而且无限制地递归调用本身是毫无意义的,递归应该分为两个明确的阶段,回溯与递推
回溯与递推
1、递归调用应该包含两个明确的阶段:回溯,递推
回溯就是从外向里一层一层递归调用下去,
回溯阶段必须要有一个明确地结束条件,每进入下一次递归时,问题的规模都应该有所减少(否则,单纯地重复调用自身是毫无意义的)
递推就是从里向外一层一层结束递归
、示例+图解。。。
salary(5)=salary(4)+300
salary(4)=salary(3)+300
salary(3)=salary(2)+300
salary(2)=salary(1)+300
salary(1)=100
salary(n)=salary(n-1)+300 n>1
salary(1) =100 n=1
def salary(n):
if n == 1:
return 100
return salary(n-1)+300
print(salary(5))
内置函数:
注意:内置函数id()可以返回一个对象的身份,返回值为整数。这个整数通常对应与该对象在内存中的位置,
但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准。
is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型