记录一下循环和break,continue
循环中条件判断和中止/跳出一定要注意缩进
num = 0
sum = 0
while True:
if num >1000:
break;
if num %2 != 0:
num = num+1
continue
sum += num
num = num+1
print(sum)
元组 和list都是有序集合 不同的是元组的元素是不可变的 而且不能添加数据 因此比list运行速度快
元组是用小括号 (0,1,2,...) list是中括号[0,1,2,....]
count(i)方法用来统计元组中i元素出现的次数 如果i不存在 返回0
index(i)方法用来查找元组中元素i首次出现的索引 如果i不存在 会报错
元组中只有一个元素时 在元素后加逗号 (1,)否则会把括号识别为优先运算符
注:元组本身的元素是不可变的 但是如果元组里包含容器 那么容器里的元素是可变的 仅仅元组中的容器元素不可变
type(i)可以用来查询i的数据类型 isinstance(i,type)可以用来判断i是否属于type类型
这两个的区别:type检查类型不会认为子类型是父类型的一种,isinstance(i,type)则会把子类型当做父类型判断
is 近似于 == .不同的是is会判断内存 而 == 则只比较内容 例如
a = "123"
b = "123"
这两个是不同的对象占用不同的内存空间 但是值一样
a is b false
a == b true
python主要的检查是否为空写法
a is None或者a is not None
在python比较变量和检查为空建议使用is
dict 类似json 以key:value方式存放数据
set 无序不重复集合 元素区分大小写 添加add() 添加集合update() 删除元素remove()注:删除的元素如果不存在会报错
discard() 删除元素 并且元素不存在的话也不会报错
函数(待补充)
类 class
类属性 属于类的属性 所有实例都可访问 也可以通过类名访问 但只能通过类修改 不能通过实例修改
实例属性 属于类的实例的属性
和java大体类似 类属性可以理解为类的静态变量可以通过类名访问
构造方法 __init__(self,args1,args2) self基本是固定写法 类似于java的this 其余属性也需要self.a1=a1赋值
私有属性 用两个下划线开头的变量 无法通过外部(类名,实例)访问 为了类中的属性不被修改
可以通过定义函数来访问 类似于java的get和set方法
类中的函数第一个参数永远都是self ,但是在外部调用的话无需显式传入
类中的函数都是实例函数 如果要定义类函数(类似于java中的静态方法 可以直接使用类名来调用)
则需要在函数添加@classmethod注解 类方法的第一个参数是类本身cls 外部调用也不用显式传入
面向对象思想
继承 和java的单继承不同 python可以同时继承多个类 用来组合一些通用的功能
子类的init方法中如果需要赋值 需要调用父类的构造方法super(子类, self).__init__(args1, args2...)来给父类的参数赋值
多态 和java相同 子类和父类都有的方法会会优先找子类的实现
可以通过isinstance(i,type)方法来判断i是否为type类型 假设i是type的子类 那么也会返回true
也可以通过type(i)来获取i实例的类型
可以用dir(i)方法 获取i 的类的所有变量和方法 一些下划线开始和结束的变量是系统内置方法
可以使用getattr(i,name)获取i实例的name属性的值 setattr(i,name,value)可以对i实例的name属性赋值value
getattr如果i没有name这个属性的话会报错 可以使用getattr(i,name,default)获取 如果name属性不存在 那么就返回默认值default
类的特殊方法(python内置函数)
双下划线开始 双下划线结束的 就是内置函数
__str__() 和 __repr__() 类似于java的toString方法 重写以便打印自己想要的东西 str()调用的是__str__,而直接打印变量调用的是__repr__
__len__() 类似于java的length方法 获取值的长度或者个数
class fib:
def __init__(self,num):
self.count = []
a = 0
b = 1
self.num = num
for i in range(num):
self.count.append(a)
a,b = b,a+b
def __len__(self):
return self.num
def __str__(self):
return str(self.count)
print(fib(10))
print(len(fib(10)))
重写str和len函数的示例
__slots__方法可以限制外部动态添加属性
__slots__ = ('arg1', 'arg2', 'arg3') 这样外部对象只能添加或修改这3个属性 无法增加新的属性
__call__方法 可以使一个类当做函数调用 例如一个类实现了call方法并且需要1个参数args 那么在外部可以直接类名(args)这样调用
模块
导入模块 import 模块名 类似于java中的导包 还可以使用from 模块名 import x 来导入模块内的部分函数或属性
还可以使用from 模块名 import * 来导入模块内的所有内容 这样调用就无需加模块名 但是有可能会和本模块中同名的函数冲突
这种情况有两个解决办法 一种是直接导入模块 二是对导入的方法重命名 例如 from math import pi as pi2这样可以使用pi2调用math模块的pi方法
函数式编程
高阶函数 可以把一个函数当做参数传入 支持匿名函数 支持返回函数(闭包)
例如 def add(a,b,f):
return f(a)+f(b)
就是把函数当做变量 可以传递
map(f,list)函数可以传入一个函数参数f和一个list参数 并且对list的每个元素执行f函数 返回执行后的list
reduce(f,list)函数也是传入一个函数参数f和一个list函数 但是传入的函数f需要有两个参数 从list前两个元素开始执行函数f 然后把执行结果依次和list的后面的每个元素执行f函数 当没有元素后返回总的结果
filter(f,list)函数传入一个函数参数f和一个list 并且根据每个元素执行f的结果(true或false)最终整理成一个新的list返回 适合于过滤list中不符合标准的元素
sorted()函数可以用来排序 也可以指定参数key=f传入f参数用来指定排序的规则 例如list中包含了别的类型的容器 元组 则可以指定f参数中返回对元组某个位置的结果用来排序 也可以指定reverse = True参数来倒序排列
函数也可以在内部定义函数 并且把内部函数返回 返回内部函数不能带小括号 在内部函数中引用了外部函数的变量 这种情况不要使用循环变量 或者后续会改变的变量
匿名函数 可以直接在函数的参数值写入 无需在外部定义函数 写法lambda x: x*x 冒号前为匿名函数的参数 匿名函数只能有一个表达式 并且不需要return 表达式的值会自动返回 例如sorted(l,key=lambda s:s.lower()) 这个匿名函数会把l里的每个元素转化为小写在进行排序
decorator
decorator类似java的装饰器模式 接收一个函数参数f 并返回一个新的函数 可以使用@注解来标注装饰器函数
这个链接讲的很详细 包括内嵌函数 传值等 Python Decorator
偏函数 functools.partial() 有的函数有很多参数 偏函数可以用来为函数指定默认值
例如 int2 = functools.partial(int,base=2) 传入int()函数不带小括号 这样我们调用int2函数会自动按照2进制转换
网友评论