第四章 程序控制结构
程序控制结构中的表达式由运算符和操作数组成,结果为true or false
一.条件表达式
(一)条件表达式的True、False值
1.False:False、0、None、空列表、空元组、空集合、空字典、空字符串
2.True:非False都为True
(二)运算符
1.关系运算符---=,<,>
(1)可以连续使用,符合人的逻辑思维
print(1<2<3) True
print(1<3>2) True
(2)条件表达式中不允许使用赋值运算符"="
(3)具有惰性求值的特点,只计算必须计算的值
2.逻辑运算符
(1)and、or---具有惰性求值的特点
(2)not---not false=true,not true=false
3.使用函数
二.选择结构
(一)单分支结构 if
1.采用严格的缩进格式
2.“:”不可缺少,表示一个语句块的开始
3.if条件表达式的判断没有括号
4.存在非缩进,不换行的格式但不建议
如 if 3>2:print(3);print(5)
(二)双分支结构 if else
if 表达式:
语句块1
else:
语句块2
(三)多分支结构
if 表达式1:
语句块1
elif 表达式2:
语句块2:
elif 表达式3:
语句块3
else:
(四)选择嵌套结构
在if中嵌套if和else, 在else中嵌套if和 else, 要注意控制不同级别代码的缩进量
三.循环结构
(一)for循环
for i in 可迭代对象:
语句块1
else:
语句块2
else语句与for语句同级,当for循环自然结束时else语句才执行。for循环因break语句异常结束循环,else语句不执行
(二)while循环
while 条件表达式:
语句块1
else:
语句块2
else语句与while语句同级,当while循环的条件表达式不成立结束时else语句才执行。while循环因break语句异常结束循环,else语句不执行
(三)break与continue
break:结束所属层次的循环
continue:结束某层次的一次循环
(四)循环代码优化技巧
1.先实现预定功能
2.再对代码进行优化,追求更高的执行效率
第五章 函数
一.函数参数
(一)顺序索引参数
Python默认按参数对应位置穿参
(二)关键字参数
当参数较多时,防止传值错位,在实参前加上形参的名字
def f(name,word):
print(name+word)
A=liuzun
B=爱编程
f(name=A,word=B)
(三)形参默认参数
为形参设置默认值,若实参不为空则被实参值覆盖
def f(name=liuzun,word=爱编程)
(四)收集参数
def f(*params):
print(len(params))
print(params[1])
f('A','B','C')
当收集参数与一般参数共存时,要使用关键字参数为一般参数指定传值方向
def f(*p,word1,word2):
print(len(p))
print(p[0])
f('A',word1='B',word2='C')
二.全局变量与局部变量
(一)全局变量
函数体外声明的变量,作用域为全部代码,但不能在函数内部修改(若修改其实是在函数内部创建了一个重名的局部变量)
(二)局部变量
函数内部声明的变量,作用域为所在函数体,可以用gloable将局部变量转变为全局变量
三.内嵌函数---在函数内部定义函数
(一)内嵌函数的特点
1.内嵌函数只能访问外嵌函数的值,不能直接修改外嵌函数的值
2.内嵌函数只能在所在的外嵌函数中调用
3.内嵌函数修改外嵌函数的值的间接方法
- 容器对象
- nonlocal将内部变量转变为外嵌函数的变量
(二)函数闭包
1.定义:内嵌函数对外嵌函数的非全局变量进行引用,那么内嵌函数就会被称为闭包
def FunX(x):
def FunY(y):
return x*y
return FunY
i=FunX(8)(5)
j=FunX(8)
print(i) #40
print(j(5)) #40
四.lambda表达式
(一)特点
只保留参数和表达式的函数
lambda x,y,z:x+y+z
(二)优点
- 不使用时,自动释放内存空间
- 精简代码
- 增加代码可读性,不必向前寻找函数
第六章 类与对象
一.面向对象程序设计特点
(一)继承
(二)封装
(三)多态
二.面向对象编程
(一)self
与java中this作用相同,用于接收对象的实例
(二)私有变量
1.用__属性名的方式声明私有变量
2.私有变量只能通过方法或对象名.-类名--属性名的方式访问
3.继承的特点
- 子类自动继承父类的属性和方法
- 子类可以重写父类的成员和方法
- 如果父类重写自己的构造方法,那么子类将会继承父类在构造方法中声明的对象,若想访问父类的属性
- 可以用super()函数
- 将子类声明的对象传入父类构造方法中,然后将父类属性的值赋给子类的属性
4.属性的名字若与方法重名,方法就会被覆盖
5.类对象的改变可以使未被赋值的实例对象发生改变
6.绑定:类对象首先访问方法和属性后,方法和属性就与类对象绑定,那么实例对象就无法对属性和方法进行操作,不过在方法的参数列表中加入self接收实例对象,实例对象就能对属性和方法进行操作