选择循环结构、函数

选择结构

通过判断条件是否成立,来决定执行哪个分支,有单分支结构、双分支结构和多分支结构

单分支选择结构

语法形式如下
for 条件表达式:(条件表达式可以是逻辑表达式、关系表达式、算术表达式等等
语句/语句块(可以是一条或多条语句,但缩进必须保持一致)
·在选择和循环结构中,条件表达式的值为False的情况如下:
False、0、0.0、空值None、空序列对象(空列表、空元组、空集合、空字典、空字符串),空range对象、空迭代对象

双分支选择结构

语法格式如下
if 条件表达式 :
语句1/语句块1
else:
语句2/语句块2

三元条件运算符

语法格式:
条件为真时的值 if(条件表达式) else 条件为假时的值

多分支选择结构

格式:
if 条件表达式1:
语句1/语句块1
elif 条件表达式2:
语句2/语句块2
·····
else:
语句n+1/语句块n+1

选择结构嵌套

使用时需注意**控制好不同级别代码块的缩进量(**缩进量决定了代码的从属关系)

循环结构

重复执行一条或多条语句
1.while循环
格式如下:
while 条件表达式:
循环体语句
2.for循环
for 变量 in 可迭代对象:
循环体语句
遍历字典:
在这里插入图片描述
range对象
range是一个迭代器对象,用来产生指定范围的数字序列
range(start, end,[step])生成的数值序列是从start开始到end结束,start默认为0,step默认为1
可迭代对象
1.序列(字符串、列表、元组)
2.字典
3迭代器对象(iterator)
4.生成器对象(generator)
嵌套循环
一个循环体内可以嵌入另一个循环,一般称为“嵌套循环”/“多重循环"
break语句
可用于while和for循环,用来结束整个循环,当有嵌套循环时,break只能跳出到最近一层的循环
continue语句
结束本次循环,继续下一次,多个循环嵌套时,也是应用于最近的一层
else语句
while和for循环可以附带一个else语句,如果for、while没有被break语句结束,则会执行else子句,否则不执行
for 变量 in可迭代对象:
循环体
else:
语句块

循环代码优化

1.尽量减少不必要的计算
2.嵌套循环中,尽量减少内层循环的计算,尽可能向外提
3.尽量使用查询较快的局部变量
4.连接多个字符串,使用join()而不用+
5.列表尽量在尾部进行元素插入和删除
使用zip()并行迭代
通过zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停止

推导式创建序列

从一个或多个迭代器快速创建序列的一种方法,可以将循环和条件判断相结合
1.列表推导式
[表达式 for item in 可迭代对象]
[表达式 for item in 可迭代对象 if 条件判断]
2.字典推导式(生成字典对象)
{key_expression : valus_expression for 表达式 in 可迭代对象}
3.集合推导式
{表达式 for item in 可迭代对象}
{表达式 for item in 可迭代对象 if 条件判断}
4.生成器推导式(生成元组)
返回生成器对象,一个生成器只能使用一次,生成器是可迭代的对象

函数

1.一个程序由一个个任务组成;函数代表一个任务或一个功能
2.函数是代码复用的通用机制
1.内置函数
可以直接使用
2.标准库函数
通过import语句导入库,然后使用其中定义的函数
3.第三方库函数
也通过import导入
4.自定义函数

函数的定义和调用

语法:
def 函数名(参数列表):
“文档字符串”
函数体/若干语句
要点
1.使用def来定义函数,使用def时会创建一个函数对象,并绑定到函数变量名上
2.参数列表
①圆括号内是形式参数列表,使用逗号隔开
②形式参数不需要声明类型,不需要指定函数返回值类型
③无参数,也必须保留空的圆括号
④实参列表必须与形参列表保持一一对应
3.return返回值
①如果函数体中包含return语句,则结束函数执行并返回值
②如不包含return语句,返回None值
4.先定义函数后调用,先调用def创建函数对象
①内置函数对象会自动创建
②标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句

文档字符串(函数的注释)

通过三个单引号或双引号实现

返回值

要返回多个返回值,使用列表,元组,字典,集合将多个值存起来即可

变量的作用域(全局变量和局部变量)

1.全局变量
①在函数和类定义之外声明的变量,作用域为定义的模块,从开始到结束
②全局变量降低了函数的通用性和可读性,应尽量避免全局变量的使用
③全局变量一般作常量使用
④函数内要改变全局变量的值,使用globe声明
2.局部变量
①在函数体(包含形式参数)声明的变量
②局部变量的引用比全局变量快,优先考虑使用
③如全局变量和局部变量同名,则在函数内隐藏全局变量,只使用同名的局部变量

参数的传递

本质上是:从实参到形参的赋值操作,都是”引用传递“,不是值传递
1.对”可变对象“进行”写操作“,直接作用于原对象本身
2.对”不可变对象“进行“写操作”,会产生一个新的”对象空间“,并用新的值填充这块空间(起到值传递效果,但并不是值传递
可变对象有:字典、列表、集合、自定义的对象等
不可变对象有:元组、数字、字符串、function等
传递可变对象的引用
传递参数是可变对象,实际传递的还是对象的引用,在函数中不创建新的对象拷贝,直接修改传递的对象
传递不可变对象的引用
传递参数是不可变对象,实际传递的还是对象的引用,在赋值操作时,由于不可变对象无法修改,会创建一个新的对象

浅拷贝和深拷贝

使用内置函数copy(浅拷贝),deepcopy(深拷贝)
浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用,对象包含的子对象内容不拷贝。源对象和拷贝对象会引用同一个子对象
深拷贝:会将子对象的内存全部拷贝一份,对子对象的修改不会影响原对象。源对象和拷贝对象引用不同的子对象
传递不可变对象用的是浅拷贝

位置参数

函数调用时,实参默认按位置顺序传递,需要个数和形参匹配

默认值参数

为某些参数设置默认值,这样参数在传递时就是可选的**(默认值参数必须放到其他参数后面)**

命名参数

按照形参的名称传递参数

可变参数

指的是可变数量的参数
1.*param(一个星号),将多个参数收集到一个“元组”对象中
2.**parameter(两个星号),将多个参数收集到一个字典对象中

强制命名参数

在带星号的“可变参数”后面增加新的参数,必须是“强制命名参数”
(直接通过形参名)

lambda表达式和匿名函数

lambda表达式可以用来声明匿名函数,lambda函数是一种简单的、在同一行中定义函数的方法,实际生成了一个函数对象,lambda只允许包含一个表达式,不能包含复杂语句,改表达式的计算结果就是函数的返回值,基本语法格式如下:
lambda arg1,arg2,arg3(函数的参数)·····:<表达式>

eval()函数

将字符串当成有效的表达式来求值并返回计算结果
语法:eval(source[,globals[,locals]])->value
参数:
source:一个Python表达式或函数complie()返回的代码对象
globals:可选,必须是dictionary
locals:可选,任意映射对象

递归函数

自己直接或间接调用自己的函数
1.终止条件
表示递归什么时候结束,一般用于返回值,不再调用自己
2.递归步骤
把第n步的值和第n-1步相关联
递归函数会创建大量的函数对象,过量的消耗内存和运算能力,处理大量数据时谨慎使用

嵌套函数(内部函数)

在函数内部定义的函数
1.封装-数据隐藏
外部无法访问嵌套函数
2.贯彻DRY(Don’t t Repeat Yourself)原则
嵌套函数,可以让我们在函数内部避免重复代码
3.闭包

nonlocal 关键字

nonlocal 声明外层的局部变量,声明之后可以修改使用
global 声明全局变量

LEGB规则

在查找名称时,是按照LEGB规则查找的:(先)Local–>Enclosed–>Global–>Built in.(后)
如均未查到,则报错
Local:指的是函数或者类的方法内部
Enclosed:指的是嵌套函数
Global:指的是模块中的全局变量
Bulit in:指的是Python中为自己保留的特殊名称

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值