本周内容总结
1.文件操作
2.函数
3.函数参数
4.装饰器
5.算法
6.生成式
7.内置函数
8.可迭代对象
9.迭代器对象
1.文件操作
1.文件的概念 就是操作系统暴露给用户操作硬盘的快捷方式
eg:双击一个文件 其实是从硬盘将数据加载到内存
ctrl+s保存文件 其实是将内存中的数据刷到硬盘保存
2.文本模式
默认的模式 rt wt at
1.只能操作文本文件
2.读写都是以字符为单位
3.需要指定encoding参数 如果不知道则会采用计算机默认的编码
3.二进制模式(bytes模式)
不是默认的模式 需要自己指定 rb wb ab
1.可以操作任意类型的文件
2.读写都是以bytes为单位
3.不需要指定encoding参数 因为它已经是二进制模式了 不需要编码
4.文件诸多方法
1.read()
一次性读取文件内容 并且光标停留在文件末尾 继续读取则没有内容
并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出
括号内还可以填写数字 在文本模式下 表示读取几个字符
2.for循环
一行行读取文件内容 避免内存溢出现象的产生
3.readline()
一次只读一行内容
4.readlines()
一次性读取文件内容 会按照行数组织成列表的一个个数据值
5.readable()
判断文件是否具备读数据的能力
6.write()
写入数据
7.writeable()
判断文件是否具备写数据的能力
8.writelines()
接收一个列表 一次性将列表中所有的数据值写入
9.flush()
将内存中文件数据立刻刷到硬盘 等价于ctrl + s
2.函数
1.函数语法结构
def 函数名(参数):
'''函数注释'''
函数体代码
return 返回值
2.函数的定义与调用
1.函数在定义阶段只检测语法 不执行代码
def func():
pass
2.函数在调用阶段才会执行函数体代码
func()
3.函数必须先定义后调用
4.函数定义使用关键字def函数调用使用:函数名加括号
3.函数的分类
1.空函数
函数体代码为空,使用的pass或者...补全的
空函数主要用于项目前期的功能框架搭建
def register():
"""注册功能"""
pass
2.无参函数
定义函数的时候括号内没有参数
def index():
print('from index function')
3.有参函数
定义函数的时候括号内写参数,调用函数的时候括号传参数
def func(a):
print(a)
4.函数的返回值
1.什么是返回值
调用函数之后返回给调用者的结果
2.如何获取返回值
变量名 赋值符号 函数的调用
res = func() # 先执行func函数 然后将返回值赋值给变量res
3.函数体代码中没有return关键字 默认返回None
4.函数体代码有return 如果后面没有写任何东西还是返回None
5.函数体代码有return 后面写什么就返回什么
6.函数体代码有return并且后面有多个数据值 则自动组织成元组返回
7.函数体代码遇到return会立刻结束
3.函数的参数
1.位置参数
位置形参 函数定义阶段括号内从左往右依次填写的变量名
def func1(a, b, c):pass
位置实参 函数调用阶段括号内从左往右依次填写的数据值
func1(1, 2, 3)
def func1(a, b):
print(a, b)
越短的越简单的越靠前
越长的越复杂的越靠后
但是遇到下列的情况除外
同一个形参在调用的时候不能多次赋值
2.默认参数 就是关键字形参
提前就已经给了,用户可以不传,也可以传
默认参数的定义也遵循短的简单的靠前 长的复杂的靠后
3.可变长形参
*号在形参中,用于接收多余的位置参数 组织成元组赋值给*号后面的变量名
**号在形参中,用于接收多余的关键字参数 组织成字典的形式赋值给**号后面的变量名
4.可变长实参
*在实参中,类似于for循环 将所有循环遍历出来的数据按照位置参数一次性传给函数
**在实参中,将字典打散成关键字参数的形式传递给函数
4.装饰器
1.装饰器是在不改变被装饰对象原代码和调用方式的情况下给被装饰对象添加新的功能
2.是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果
3.装饰器语法糖
语法糖会自动将下面紧挨着的函数名当做第一个参数自动传给@函数调用
最常用的无参装饰器
多层语法糖 加载顺序由下往上
每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖
如果上面没有语法糖了 则变形
4.装饰器模板
# def outer(func_name):
# def inner(*args, **kwargs):
# res = func_name(*args, **kwargs)
# return res
# return inner
# @outer
# def index():
# pass
# 不常用的有参装饰器
# def outer_plus(mode):
# def outer(func_name):
# def inner(*args, **kwargs):
# res = func_name(*args, **kwargs)
# return res
# return inner
# return outer
# @outer_plus('MySQL')
# def func():
# pass
5.算法
1.算法就是解决问题的有效方法,不是所有的算法都很高效也有不合格的算法
2.二分法是算法中最简单的算法,甚至都称不上是算法
二分法使用要求 待查找的数据集必须有序
二分法的缺陷 针对开头结尾的数据,查找效率很低
常见算法的原理以及伪代码
二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何链表是否成环)
6.各种生成/式表达式
1.三元表达式
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2
不推荐嵌套
res = '老师' if name == 'jason' else '学生'
print(res)
2.列表生成式
先看for循环 每次for循环之后再看for关键字前面的操作
new_list = [name + "_NB" for name in name_list]
print(new_list)
new_list = [name + "_NB" for name in name_list if name == 'jason']
print(new_list)
3.字典生成式
s1 = 'hello world'
for i,j in enumerate(s1,start=100):
print(i,j)
d1 = {i: j for i, j in enumerate('hello')}
print(d1)
4.集合生成式
res = {i for i in 'hello'}
print(res)
7.内置函数
1.zip
l1 = [11,22,33]
l2 = ['jason','kevin','oscar','jerry','tony']
l3 = [1,2,3,4]
res = zip(l1,l2,l3)
print(list(res))
#[(11, 'jason', 1), (22, 'kevin', 2), (33, 'oscar', 3)]
2.filter
l1 = [11,22,33,44,55,66,77,88]
res = filter(lambda x: x>40,l1)
print(list(res))
#[44, 55, 66, 77, 88]
3.sorted
l1 = [21,12,53,64,76,32,11,22]
res = sorted(l1)
print(res) 默认升序
#[11, 12, 21, 22, 32, 53, 64, 76]
4.abs() 绝对值
print(abs(-100))
print(abs(100))
5.all() 所有数据值对应的布尔值为True结果就是True,否则返回True
print(all([0,1,2,3]))
print(all([1,2,3,4,true]))
6.any() 所有数据值对应的布尔值有一个为True结果就是True,否则返回False
print(any([0,None,'',1]))
print(any([0,None,'']))
7.bin()转二进制 oct()转八进制 hex()转十六进制 int()整型
8.bytes() 转换成bytes类型
9.callable()判断名字是否可以加括号调用
name = 'jason'
def index():
print('from index')
print(callable(name)) false
print(callable(name)) True
10.chr() ord() 基于ASCII码表做数字与字母的转换
print(chr(65)) A
print(ord('A')) 65
11.dir() 返回括号内对象能够调用的名字
print(dir('hello'))
12.divmod() 元组 第一个数据为整除数 第二个是余数
res = divmod(100, 2)
print(res) (50, 0)
res = divmod(100, 3)
print(res)
"""
总数据 每页展示的数据 总页码
100 10 10
99 10 10
101 10 11
"""
page_num, more = divmod(9999, 20)
print(divmod(99, 10)) (9, 9)
if more:
page_num += 1
print('总页码为:', page_num) 总页码为: 500
13.enumerate() 枚举
14.eval() exec() 能够识别字符串中的python并执行
s1 = 'print("哈哈哈")'
eval(s1)
exec(s1)
s2 = 'for i in range(100):print(i)'
eval(s2) 只能识别简单的python代码 具有逻辑性的都不行
exec(s2) 可以识别具有一定逻辑性的python代码
15.hash() 哈希加密
print(hash('jason'))
16.id() input() isinstance()
17.map() max() min()
18.open()
19.pow() 幂指数(次方)
print(pow(2, 2))
print(pow(2, 3))
print(pow(2, 4))
20.range()
21.round() 四舍五入
print(round(98.3))
print(round(98.6))
22.sum()
print(sum([11, 22, 33, 44, 55, 66]))
8.可迭代对象
1.可迭代对象
对象内置有__iter__方法的都称为可迭代对象
1.内置方法 通过点的方式能够调用的方法
2.__iter__ 双下iter方法
2.可迭代对象的范围
不是可迭代对象 int float bool 函数对象
是可迭代对象 str list dict tuple set 文件对象
3.可迭代的含义
迭代:更新换代(每次更新都必须依赖上一次的结果)
可迭代在python中可以理解为是否支持for循环
9.迭代器对象
1.迭代器对象是由可迭代对象调用__iter__方法产生的
迭代器对象判断的本质是看是否内置有__iter__和__next__
2.迭代器对象的作用
提供了一种不依赖于索引取值的方式
正因为有迭代器的存在 我们的字典 集合才能够被for循环
3.迭代器对象实操
s1 = 'hello' # 可迭代对象
res = s1.__iter__() # 迭代器对象
print(res.__next__()) # 迭代取值 for循环的本质
一旦__next__取不到值 会直接报错
4.注意事项
可迭代对象调用__iter__会成为迭代器对象 迭代器对象如果还调用__iter__不会有任何变化 还是迭代器对象本身
标签:__,函数,迭代,res,print,def,10.16
From: https://www.cnblogs.com/yueq43/p/16796606.html