elif = else if
三元操作符
small = x if x < y else y
及
x, y = 5, 9
if x < y:
small = x
else:
small = y
断言 assert
当这个关键字后边的条件为假的时候,系统会自动崩溃并抛出AssertionError的异常。
elif = else if
三元操作符
small = x if x < y else y
及
x, y = 5, 9
if x < y:
small = x
else:
small = y
断言 assert
当这个关键字后边的条件为假的时候,系统会自动崩溃并抛出AssertionError的异常。
数据类型
整形 int()
浮点型 float()
e记法
布尔类型(ture false)
数据类型的转换
字符串 str()
整形 int()
浮点型 float()
获取数据格式
type()
isinstance()
Python
每个语言都是打飞机入门
协议
在python中,协议是指南。
所有可迭代的数据类型,都属于容器类型
容器的协议:
目前看来 有一些方法 是可以利用的:
比如
制作 长度不可变的容器
制作长度可变的容器
第47课没听懂。
描述符存在的意义是什么?
为什么要将a类的实例指派给另一个类?
这跟a类对象持有b类对象有什么区别?
这个跟一个类持有另一个类的引用。有什么区别呢?
java里有AOP思想,用于解决当前类持有其他类对象的替代做法。
python难道没有?
或者说描述符就能解决这个问题?
通过property
属性访问
setattr 被触发的原理
什么情况下会被触发?
有什么风险?
object.x会触发settr方法
如果在setattr方法里 继续设置对象的属性,可能会无限递归 调用setattr自身。
解决办法有,找到一种条件,向setattr返回 super().setattr(),这样会真的走python底层的赋值方法。
解决办法2:
通过object.__dict_[name]字典的方式赋值
object.method()
会默认将object自身传递给method函数
注意区分object是类对象 还是实例对象
魔法方法
被双下划线包围
面向对象Python编程
1. __init__
该函数禁止复写的时候春娣返回值
对象实例化过程第一个魔法方法
1. __new__(cls[,...])
可以在这个方法里,复写,设置返回值。
这一步早于__init__初始化
2.__del__(self)
del object 时,触发的方法
注意:不是必然触发。
必须保证所有同时指向它的对象都调用了del。
最后一个调用del销毁的对象引用,会触发__del__方法。
也就是说 del object。并不会立即执行销毁某个对象的操作。
组合?
c类持有a类和b类的实例化对象。称为组合。
self:调用者,属性、方法的所有者。
绑定:
属性和方法属于类,不属于实例对象。
通过dict关键字打印可以看出。
类、类对象、实例对象
python的变量不需要声明。直接调用并复制,就相当于初始化
1.覆盖关系。
类对象的属性,与类定义的属性绑定。
实例对象的属性,会覆盖类对象的属性
属性和方法名字相同,属性会把方法覆盖掉
2.生命周期问题
类定义的属性和方法,不随着类对象的销毁、创建而存在。
即:类对象创建,类中属性和方法都创建了;
类通过del 销毁、删除,类中属性和方法依然存在。依然存在于内存中。之前创建的对象却依然存。
c语言中:
静态属性 只有在程序退出的时候,才会背释放
self是什么
对象的方法,必须传递self
对象会将自身,传给方法的第一个形参。
魔法仓鼠
公有和私有
python命名技术:
name mangling 名字改编,名字重整技术
在python中定义私有变量只
pass 占位符
如果你什么都不想写,可以写pass占位
相当于java的 //todo
普通员工月薪3500
ceo月薪1000000
项目经理月薪20000
gui编程
easygui
模块导入的三种方式
1.
import esaygui
easygui.method
2.
from easygui import *
method
3.
import easygui as g
g.method
方式三的好处是避免同名。避免抛出异常。
else
- if:如果怎样、如果不怎样
- for、while:循环结束,进入else
- except:没有异常就怎样
i=10
while i>0:
print("%s在循环体里" %(i))
i = i - 1
else:
print("进入else了,i是%s" %(i))
with
- with open:文件操作
assert 断言测试
assert len()>0
为假,抛出异常
为真,正常执行
异常处理
Exception
error
- oserror
- indexerror
- keyerror
模块:
是一个包含所有你定义的函数和变量的文件。
识别模块的方法是:模块的后缀是.py
模块可以被别的程序引入。用来调用该模块中的函数等功能。
常见模块:
os模块:代指操作系统
import os
os.remove
os.rmdir
os.listdir
os.mkdir
os.mkdirs
os.linesp
os.system()调用shell命令
模块2:
os.path模块:代指路径操作
basename 去掉目录路径,单独返回文件名
dirname 去掉文件名,单独返回目录路径
join
splite
splitext分离目录名与文件扩展名
isabs 判断是否是绝对路径
exists 判断路径(文件或文件目录)是否存在
isfile
isdir
islink
filepath=r"D:\workspace\codespace\python\webapps\test17.py"
print(filepath)
import os.path as pt
print(pt.dirname(filepath))
字典内置方法
fromkeys()
keys()
values()
items()
判断是否存在
get(keyname) 判断某位置是否存在item
keyname in dictname
清空
dict1.clear()
del dict1
dict1={} 不安全,存在隐患
赋值与
汉诺塔
审题
如果为64个盘子。从左到右,棍子编号依次为x,y,z。
解题移动过程为:
将(从上往下数,第1,第2...)前63个盘子从x移动到y
将y上的63个盘子移动到z上。
限制条件1:大盘子必须在小盘子下面;大盘子不可以在小盘子上面
步骤1:借助z,将x上的前63个盘子移动到y上。
步骤1.2:将第64个移动到z上
步骤2:借助x,将y上63个盘子移动到z上。
将步骤1拆解:(将63个盘子从x移动到y)
- 将前62个盘子从x移动到z
- 将第63个从x移动到y
- 将z上的62个盘子移动到y
将步骤2拆解:(将y上的63个盘子从y移动到z)
- 将前62个盘子从y移动到x
- 将第63个盘子移动到z
- 将x上的62个盘子移动到z上
浮点型和整数型 在Python里面形式只有一个小数点的区别,
浮点型转换为整数型的时候, 截断小数点之后
int(5.9)=5
判断一个变量类型
两个函数:
type isinstance 函数
type(var)
isinstance(var, 变量类型)
>>> isinstance(1,int)
True
>>> isinstance(2,float)
False
递归
1.自身调用自身
2.停止的条件
例子:
1.汉诺塔游戏
2.树结构的定义
3.谢尔宾斯基三角形
4.阶乘的原理
5.递归是一个台阶,进阶高级程序的必备。
递归非常消耗内存、浪费cpu时间。很容易无限递归。
用在恰到好处的地方。
Python默认限制了递归层数为100层。
如何解除递归限制?
import sys
sys.setrecursionlimit(1000000)
最重要的是迭代器的概念
python提供的iteratior对象
len()
max()
min()
append()
pop()
sum()
reversed()
enumerate()//重要
zip()//重要
元组
1.最大区别,列表可以任意修改其中的元素;数组不可以修改其中的元素,不可改变
2.元组的关键是逗号,
tupe1=(2)不是创建元组,是number变量
tupe2=(2,)才是创建一个元组
3.拼接的时候,必须用同一个数据类型