一、计算机的原理

1、计算机组成

中央处理器 CPU 

存储器分内存储器和外存储器,内存储器叫内存,外存储器有硬盘U盘等,CPU负责处理内存里的东西,因为在内存处理效率高,如果要处理硬盘或外存的东西,先调用到内存。

2、Python介绍

二、Python基础语法

1、注释

单行注释

# 注释内容

多行注释,单引号双引号都可以

"""
  注释内容
  注释内容
"""

2、变量

变量的作用

变量是存储数据时,当前数据所在的内存地址的名字

定义变量

由数字、字母、下划线组成,不能以数字开头,不能使用内置关键字,严格区分大小写。

使用变量
stu_name = 'tom'
print(stu_name)
print('大家好')

3、认识bug和使用debug工具

4、数据类型

数值:整型int 浮点型float

bool:ture/false

字符串:str

列表list:[1,2,3]  元组tuple:(1,2,3)  列表可以进行增删改,元组不可以

集合set:{1,2,3}

字典dict:{'name':'xjj','age':18}  这种一个名称+冒号+内容的组合叫键值对

检测数据类型
stu_name = 'tom'
stu_number = 14.4
print(stu_name)
print(stu_number)
print(type(stu_number))
print(type(stu_name))

5、输出

格式化输出

作用:程序输出内容给用户

格式化符号:字符串%s,有符号十进制%d,浮点数%f

%s比较强大,可以同样表示十进制和浮点数

%.2f  保留两位小数

%06d  表示输出的整数显示位数,不足的以0补全,超出当前位数则原样输出

print('我的名字是%s,明年%d岁了' % (name, age + 1))

print(f'我的名字是{name},我今年{age}岁')

print(f'我的名字是{name},明年{age+1}岁了')
转义字符

\n 空一行,\t 制表符空一个tab距离(4个空格)

结束符

print(' hello ' , end="\n") 默认是\n,其它的也可以

6、输入

input( "提示信息" ),程序执行到input,等待执行,接收用户输入后,一般存储到变量,会把接收到的任意用户输入数据都当作字符串处理

number = input('请输入red有几个人:')
print(f'red有{number}个人')
print(type(number))

7、转换数据类型

承接上面,已知input会把接收到的数据当作字符串处理,这时候我们需要转换数据类型

eval( ),计算字符串在python中本来的类型并返回一个对象比如

str1 = '(1,2,3)'
print(type(eval(str1)))

8、运算符

算数运算符

注意优先级,()大于**大于*/大于+-

赋值运算符

多变量赋值

num1,str1,float1 = 1,'hello',1.2
复合赋值运算符
a = 10
a *= 3
print(a)

注意:先算复合赋值运算符右边的内容,再算复合赋值运算

比较运算符

==  !=  >  <  >=  <=  这些返回值是True or False

逻辑运算符

and都真才真  or有真就真  not取反

三、判断语句

1、if语句

if True:
    print('hello world')
a = int(input('请输入你的年龄:'))
if a>=18:
    print(f'你的年龄是{a},可以上网')

这边注意input默认是str数据类型,要转换一下

if-else语句
a = int(input('请输入你的年龄:'))
if a>=18:
    print(f'你的年龄是{a},可以上网')
else:
    print(f'未满18岁,不能上网')
a = int(input('请输入你的年龄:'))
if a<18:
    print(f'你的年龄是{a},属于童工')
elif (a>=18) and (a<=60):
    print(f'你的年龄是{a},合法劳动工')
else:
    print(f'你的年龄是{a},可以退休了')
if嵌套语句
a = int(input('你身上带了多少钱:'))
if a>=1:
    print('上车')
    b = int(input('车上有几个座位:'))
    if b>=1:
        print('找空位入座')
    else:
        print('没座位了,站一会')
else:
    print('余额不足')
案例:猜拳游戏 (随机数)
import 模块名
random.randint(开始,结束)
import random
player = int(input('玩家请出拳 0--石头 1--剪刀 2--布:'))
computer = random.randint(0, 2)
print(f'你出了{player},电脑出了{computer}')
if ((player == 0)and(computer == 1))or((player == 1)and(computer == 2))or((player == 2)and(computer == 0)):
    print('玩家获胜')
elif player == computer:
    print('平局')
else:
    print('电脑获胜')
三目运算符

化简简单if-else语句

条件成立执行的表达式 if 条件 else 条件不成立的表达式
a = 4
b = 7
c = a if a<b else b
print(c)

四、循环语句

1、while循环

while 条件:
    条件成立重复执行的代码1
i = 0
while i<5:
    print('ok',end ="\n")
    i+=1

2、break和continue语句

break语句
i = 0
while i < 5:
    if i == 3:
        break
    print(i)
    i += 1
continue语句

continue语句之前要写 i += 1,不然会陷入死循环 

i = 0
while i < 5:
    if i == 3:
        print(f'{i}不输出')
        i += 1
        continue
    print(i)
    i += 1

3、while循环嵌套的作用和语法

这里注意 i = 0要卸载外层循环里内层循环外,做到一个重置内存循环的作用

j = 0
while j < 3:
    i = 0
    while i < 3:
        print('我错了')
        i += 1
    print('刷碗')
    j += 1
while循环嵌套示例

打印正方形星号

j = 0
while j < 5:
    i = 0
    while i < 5:
        print('*', end = "")
        i += 1
    print(end = "\n")
    j += 1

打印三角形星号,注意改成 i <= j,由行号控制个数

j = 0
while j < 5:
    i = 0
    while i <= j:
        print('*', end = '')
        i += 1
    print(end = "\n")
    j += 1

九九乘法表

j = 1
while j <= 9:
    i = 1
    while i <= j:
        print(f'{i}×{j}={i*j}', end = ' ')
        i += 1
    print(end = "\n")
    j += 1

4、for循环

语法
for 临时变量 in 序列:
str1 = 'helloworld'
for i in  str1:
    print(i)
用break or continue退出for循环(类似while)
str1 = 'helloworld'
for i in  str1:
    if i == 'w':
        break
    print(i)

5、循环else语句的使用

要循环正常结束之后才执行else,注意是正常结束,如果break提前结束则不执行else,如果是continue则执行else,while与for同理

五、字符串

1、认识字符串

字符串可以用单引号双引号,也可以用三个单/双引号,三引号可以正常输出换行,单双不行

a = ('asd'
     'bs')
print(a)
b = '''hello 
world'''
print(b)

2、字符串的输入输出

输出可以直接输出和格式化输出

# 输入
n = input('请输入密码:')
print(f'密码是{n}')
print(type(n))

3、切片

字符串下标
i = 0
str = 'sadgvxce'
while i < 8:
    if str[i] == 'g':
        i += 1
        continue
    print(str[i])
    i += 1
切片

切片是指对操作的对象截取其中一部分的操作 序列【开始位置下标:结束位置下标:步长】

注意:不包含结束位置下标对应数据,正负整数均可;步长是选取间隔,默认为1,正负数皆可

str = '012345678'
print(str[0:5:2])
print(str[0:5:1])

不写开始,默认0开始;不写结束,表示选取到最后;不写步长,默认为1;不写开始和结束(但是要写冒号),选取所有。

步长为-1,倒序(从右往左数);起止位置上的负数,-1是最后一个数据

!!如果选取方向和步长冲突,则无法选取

4、字符串的常用操作方法

查找find(),index(),count()

find()用法:序列.find( '子串' , 开始下标,结束下标 ) 存在返回开始下标,不存在返回-1

rfind()从右侧开始查找

index()用法:序列.index( '字串',开始下标,结束下标 )存在返回开始下标,不存在报错

rindex()从右侧开始查找 

count()用法:序列.count( '字串' ,开始下标,结束下标 )返回区间字串个数,不存在返回0

a = 'hello world and welcome and go to'
print(a.find('and' ,15,30))
修改replace(),split(),join()

replace():序列.replace(旧字串,新字串,替换次数),替换次数不写表示全部替换

replace并不会修改字符串本来的数据,只是会返回修改后的数据,说明字符串是不可变数据类型

a = 'hello world and welcome and go to'
b = a.replace('and','he')
print(b)

split():序列.split(分割字符,num) num表示分割字符出现的次数,即将来返回数据个数为num+1

a = 'hello world and welcome and go and to'
b = a.split('and',2)
print(b)

join():字符或字串.join(多字符串组成的序列)

意思就是比如我有一个'R','E','D'三个字母组成一个序列,我用 . 把他们连接起来,这时候可以join

a = ['r','e','d']
b = '.'.join(a)
print(b)
转换capitalize(),title(),lower(),upper()

capitalize():将字符串第一个字符转换成大写,!!只有首字母大写,后面的大写会转成小写

title():将字符串每个单词首字母大写

lower():将字符串中大写转小写

upper():将字符串中小写转大写

删除首位空白字符lstrip(),rstrip(),strip()
a = '    hello world and go and to and she      '
print(a.rstrip())
对齐ljust(),rjust(),center()

序列.ljust(长度,填充字符)

str = 'hello'
str
'hello'
str.ljust(10)
'hello     '
str.ljust(10,'a')
'helloaaaaa'
判断1.0startswith(),endswith()

startswith():序列.startswith(字串,开始下标,结束下标) 作用是检查是否以某个字串开头是返回True,否返回False

a = 'hello world and go and to and she'
print(a.startswith(' ',5,30))

!!注意:空格也算字符,字符串首个数据是从0开始算的

endswith():同理

判断2.0isalpha(),isdigit(),isalnum(),isspace()

isalpha():至少有一个字符并且所有字符都是字母时True

isdigit():只包含数字返回True

isalnum():都是字母或数字或数字字母True

isspace():都是空白True

六、列表

1、列表的遍历

for循环

a = ['doas','mdoo','owmd']
for i in a:
    print(i)

while循环

a = ['doas','mdoo','owmd']
i = 0
while i < len(a):
    print(a[i])
    i += 1

2、列表的常用操作

查找 下标查找or函数查找index(),count(),len()

同字符串查找

判断是否存在in,not in
a = ['doas','mdoo','owmd']
print('doas' in a )
in,not in体验案例
a = ['ivy','qiana','lulu']
b = input('请输入名字:')
if b in a:
    print(f'你输入的名字为{b},用户名已存在')
else:
    print(f'输入成功')
列表增加数据append(),extend(),insert()

append():序列.append( 数据 )  追加数据到结尾,如果追加序列则是一整个序列都追加到结尾,append只能追加一个元素

extend():如果追加的是一个序列,那么会把里面的数据拆开逐一追加到列表结尾

insert():序列.insert( 下标,数据 )

a = ['ivy','qiana','lulu']
a.insert(1,'jinny')
print(a)
列表删除数据del(),pop(),remove(),clear()

del():del  目标,也可以 del  a[ 0 ]删除单个数据

a = ['ivy','qiana','lulu']
del a[2]
print(a)

pop():删除指定下标的数据,如果不指定默认删除最后一个数据,无论删哪个,pop函数都会返回这个被删除的数据   序列.pop( 数据 )

a = ['ivy','qiana','lulu']
b = a.pop()
print(a,b)

remove():序列.remove( 数据 )

clear():清空列表

修改reverse(),sort()

修改指定下标数据可以直接修改

reverse():逆序排列   序列.reverse( )

sort():排序  序列.sort( )  默认是False升序  序列.sort( reverse = True )降序

复制
a = ['ivy','qiana','lulu']
b = a.copy()
print(b)

3、列表嵌套

一个列表里面包含其他子列表

a = [['ivy','qiana','lulu'],['alyce','betty'],['xiu','jinny']]
print(a[0][1])

4、综合应用--老师随机分配办公室

需求:有三个办公室,8位老师,8位老师随机分配到三个办公室

import random
teachers = ['jinny','xiu','alyce','betty','ivy','qiana','lulu','num8']
office = [[],[],[]]
for name in teachers:
    i = random.randint(0,len(office)-1)
    office[i].append(name)
j = 0
while j < len(office):
    print(office[j],len(office[j]))
    j += 1

 七、元组

1、定义元组

如果定义的元组只有一个数据,那么这个数据后面也好添加逗号,否则数据类型为唯一数据的数据类型

a = (2,3,4)
b = ('a',)
print(type(b))

2、元组的常见操作

查找

按下标,index,count,len   !!注意在元组中count不能这样(‘字串’,起,止),这是错的,要么就是一个数据,要么就是先切片,如下图

a = ('2','3','4','5')
print(a[1:2].count('2'))
修改

在元组中,如果元组里有嵌套的列表,则可以修改列表里的数据

八、字典

1、创建字典的语法

字典里面的数据是以键值对( key:value )的形式出现,和数据顺序无关即字典不支持下标

dict1 = {'name':'ivy','age':19,'birthday':828}
dict2 = {}
dict3 = dict()

2、字典的常见操作

增:字典序列[ key ] = 值  
dict1 = {'name':'ivy','age':19,'birthday':828}
dict1['num'] = 5
print(dict1)
删:del(),clear()
dict1 = {'name':'ivy','age':19,'birthday':828}
del dict1['birthday']
print(dict1)
修改:字典序列[ key ] = 值  
dict1 = {'name':'ivy','age':19,'birthday':828}
dict1['age'] = 20
print(dict1)
查找:key值查找,get(),keys(),values(),items()

key值查找:如果当前查找的key值存在,则返回对应的值,否则报错

get():序列.get( 'key' ,默认值)    有key则返回,key不存在则返回默认值或者none

dict = {'name':'ivy','age':19,'birthday':828}
a = dict.get('id')
b = dict.get('id','没有id')
c = dict.get('name')
print(a,b,c)

keys():序列.keys()   查找字典中所有的key,返回可迭代对象,结果为:

!!可迭代对象:通常按顺序访问,不能按下标访问

values():同keys,查找字典中所有value

dict_keys(['name', 'age', 'birthday'])

items():查找字典中所有的键值对,返回可迭代对象,里面的数据是元组

dict_items([('name', 'ivy'), ('age', 19), ('birthday', 828)])

3、字典的循环遍历

遍历

keys,values,items同理

dict = {'name':'ivy','age':19,'birthday':828}
for i in dict.keys():
    print(i)
拆包

items()返回可迭代对象,内部是元组,元组数据1是key,元组数据2是value

dict = {'name':'ivy','age':19,'birthday':828}
for key,value in dict.items():
    print(f'{key} = {value}')

九、集合

1、创建集合

可以用{}或set(),但是如果要创建空集合只能用set(),因为{}用来创建空字典

集合用于存储不允许重复的数据(有去重功能)

set1 = {1,2,4,6,3}
print(set1)
set2 = set()
print(set2)

2、集合常见操作方法

增:add(),update()

add()追加单一数据:集合数据是没有顺序的,所以add可能追加到任意位置,集合有去重功能,如果增加数据是已有数据,则什么事情都不做

set1 = {1,2,4,6,3}
set1.add(5)
print(set1)

update()追加序列:如果update() 括号内是[] 追加列表中的数据,{}追加键key

set1 = {1,2,4,6,3}
set1.update([4,2,5,7])
print(set1)
删:remove(),discard(),pop()

remove删除指定数据,不存在的数据会报错

discard删除指定数据,不存在的数据不会报错

pop删除随机数据,并返回这个数据

查找:in,not in
set1 = {1,2,4,6,3}
a = 10 in set1
print(a)

十、公共操作

1、运算符

+,*,in,not in

!!注意:in 和 not in 在字典中会默认检查键而不是值

len()计算容器中元素个数

在字典中是返回键值对的个数

del 目标 或 del( 目标 )
str1 = 'asdafasd'
list = [2,3,4,5]
tuple = (2,3,4,5)
set1 = {2,3,4,5}
dict = {'name':'ivy','age':25}
del dict['age']
print(dict)
max,min

!!注意:因为max还有len,del这种是公共函数,这些是写在括号里,之前的replace,append这些是某个数据类型独有的操作方式,称之为方法,要用 . 调用

list = [2,3,4,5]
print(max(list))
range(start,end,step)

和切片类似,结束不包含,如果range只输入一个数字默认为stop,并且从0开始步长为1

for i in range(10):
    print(i)
enumerate(可遍历对象,start = 0)

start用来设置遍历数据下标的起始值,默认为0,enumerate返回结果是元组

list = ['a','b','c','d','e','f']
for i in enumerate(list):
    print(i)
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(5, 'f')

如果start = 1,就是从1开始

2、容器类型转换tuple(),list(),set()

可以互相转换,注意转换成集合set的时候会去掉重复的数据

3、while,for循环创建有规律的列表

list = []
i = 0
while i < 10:
    list.append(i)
    i += 1
print(list)
list = []
for i in range(10):
    list.append(i)
print(list)

4、推导式

4.1、列表推导式
list = [i for i in range(10)]
print(list)
带if的列表推导式range()步长实现,if实现
list1 = [i for i in range(0,10,2)]
list2 = [i for i in range(10) if i % 2 == 0]
print(list1)
print(list2)
多个for循环实现列表推导式
list = [(i,j) for i in range(0,2) for j in range(3)]
print(list)
4.2 字典推导式

作用:快速合并列表为字典或提取字典目标数据

dict = {i:i**2 for i in range(1,5)}
print(dict)

将两个列表合并为一个字典;!!注意创建的时候是两个列表[ ]合并为一个字典{ }

如果两个列表数据个数相同,len任何一个列表都可以,个数不同的话,只能len少的

dict1 = ['name','age','gender']
dict2 = ['tom',25,'man']
dict3 = {dict1[i]:dict2[i] for i in range(len(dict1))}
print(dict3)

提取字典目标数据

dict1 = ['name','age','gender']
dict2 = ['tom',25,'man']
dict3 = {dict1[i]:dict2[i] for i in range(len(dict1))}
count = {key:value for key,value in dict3.items() if value == 25}
print(count)
4.3、集合推导式
list = [1,1,4]
set = {i ** 2 for i in list}
print(set)

十一、函数

1、定义函数->调用函数

def sel_fun():
    print('显示余额')
    print('存款')
    print('取款')
print('恭喜您调用成功')
sel_fun()
print('您的余额是10000000000')
sel_fun()
print('取款成功10000')
sel_fun()

2、函数参数的作用

def add_fun(a,b):
    return a+b
c = add_fun(1,2)
print(c)

return作用:负责函数返回值,退出当前函数(导致return下方的函数体内部的代码不执行)

3、函数的说明文档

help( ):查看函数的说明文档    说明文档是定义函数完了首行缩进三引号

def add_fun(a,b):
    """求和函数"""
    return a+b
c = add_fun(1,2)
print(c)
help(add_fun)

4、函数嵌套调用

案例1:打印多条横线
def print_line():
    print('-'*10)
def print_lines():
    for i in range(5):
        print_line()
print_lines()
案例2:求三个数平均值
def add_num(a,b,c):
    return a+b+c
def average_fun(a,b,c):
    return add_num(a,b,c)/3
print(average_fun(1,2,3))

5、变量作用域

局部变量

定义在函数体内部的变量,只在函数体内部生效

全局变量

全局生效,定义在外部,如果要修改全局变量,不能在函数里修改,想要修改要global声明全局

a = 100
def fun1():
    global a
    a = 200
    print(a)
fun1()
函数返回值

返回多个值时会返回元组,也可以返回列表,元组,字典,集合

def fun():
    return 1,2
a = fun()
print(a)
(1, 2)

6、函数的参数

位置参数

根据函数定义的参数位置传递参数,顺序和个数必须一致

def fun(name,age,gender):
    print(f'名字是{name},年龄{age},性别{gender}')
fun('tom',18,'男')
关键字参数

没有顺序需求,位置参数必须在关键字参数的前面

def fun(name,age,gender,day):
    print(f'名字是{name},年龄{age},性别{gender},第几天{day}')
fun('tom',20,day = 7,gender = 'man')
缺省参数

也叫默认函数,用于定义函数,为参数提供默认值,不传数据使用默认值,传数据则修改默认值

def fun(name,age,gender = 'man'):
    print(f'名字是{name},年龄{age},性别{gender}')
fun('tom',20)
不定长参数
包裹位置传递   def fun(*args) 是元组类型
def fun(*args):
    print(args)
fun(1,2)
包裹关键字传递 def fun(**kwargs)  kw是key word  是字典类型
def fun(**kwargs):
    print(kwargs)
fun(name = 'tom', age = 20)

7、拆包和交换变量值

拆包
# 元组拆包
def fun1():
    return 1,2
num1,num2 = fun1()
print(num1)
print(num2)
# 字典拆包 先准备字典然后拆包
dict1 = {'name':'tom','age':18}
a,b = dict1
print(a,dict1[a])
print(b,dict1[b])
交换变量的值 两种方法
# 方法一 利用中间变量
c = 0
c = a
a = b
b = c
# 方法二
a,b = 1,2
a,b = b,a

8、引用

可变与不可变类型

我们可以用id( )来判断两个变量是否为同一个值的引用

这个是int不可变类型的案例 在a修改之后b已经不是和a一个地址了

a = 1
b = a
print(id(a))
print(id(b))
a = 1418
print(id(a))
print(id(b))

列表list是可变类型,案例如下

aa = [1,2]
bb = aa
print(id(aa))
print(id(bb))
aa.append(3)
print(id(aa))
print(id(bb))
引用当作实参

可以当作实参传入  int:计算前后id不同  list:计算前后id相同

十二、函数高级

1、综合案例--学员管理系统

def info_print():
    print('请选择功能-------------------')
    print('1、添加学员')
    print('2、删除学员')
    print('3、修改学员信息')
    print('4、查询学员信息')
    print('5、显示所有学员信息')
    print('6、退出系统')
    print('-'* 30)

def info_add():
    global info
    name_add = input('请输入学生姓名:')
    id_add = int(input('请输入学生学号:'))
    tel_add = int(input('请输入学生手机号:'))

    for i in info:
        if i['name'] == name_add:
            print('请勿重复输入学生')
            return

    info_dict = {}
    info_dict['name'] = name_add
    info_dict['id'] = id_add
    info_dict['tel'] = tel_add

    info.append(info_dict)
    print(info)

def info_del():
    global info
    del_name = input('请输入要删除的学生姓名:')
    for i in info:
        if i['name'] == del_name:
            info.remove(i)
            break
    else:
        print('学生不存在')
    print(info)

def info_modify():
    global info
    modify_name = input('请输入要修改信息的学生姓名:')
    for i in info:
        if i['name'] == modify_name:
            modify_num = int(input('请输入要修改的信息内容:1--学号 2--手机号'))
            if modify_num == 1:
                new_id = int(input('请输入新的学号:'))
                i['id'] = new_id
                break
            elif modify_num == 2:
                new_tel = int(input('请输入新的手机号:'))
                i['tel'] = new_tel
                break
            break
    else:
        print('学生不存在')
    print(info)

def info_index():
    global info
    index_name = input('请输入你要查询信息的学生姓名')
    for i in info:
        if i['name'] == index_name:
            print(i)
            break
    else:
        print('学生不存在')

def info_show():
    global info
    print(info)


info_print()

info = []

while True:
    fun_num = int(input('请输入功能序号:'))
    if fun_num == 1:
        info_add()
    elif fun_num == 2:
        info_del()
    elif fun_num == 3:
        info_modify()
    elif fun_num == 4:
        info_index()
    elif fun_num == 5:
        info_show()
    elif fun_num == 6:
        exit_flag = input("确认退出输入‘yes',不退出输入'no'")
        if exit_flag == 'yes':
            break
    else:
        print('不符合要求,请输入序号1~6')

2、递归函数

特点+案例求3以内累加和

1、函数内部自己调用自己;2、必须有出口

def sum1(num):
    if num == 1:
        return 1
    return num + sum1(num-1)
print(sum1(3))

3、匿名函数

应用场景

如果一个函数有一个返回值,并且只有一句代码,可以使用lambda简化

语法

lambda 参数列表:表达式

lambda表达式的参数可有可无,lambda表达式能接收任何数量的参数但只能返回一个表达式的值

fn2 = lambda:100
print(fn2)
print(fn2())

fn2返回lambda内存地址  fn2()是调用函数返回100

fn2 = lambda a,b:a+b
print(fn2(1,2))
lambda的参数形式
# 无参
fn1 = lambda : 100
print(fn1())

# 一个参数
fn2 = lambda a : a
print(fn2('ivy'))

# 默认参数
fn3 = lambda a,b,c = 100 : a + b + c
print(fn3(50,30))

# 可变参数 *argus  返回元组
fn4 = lambda *argus : argus
print(fn4(1,2,3))

# 可变参数 **kwargus
fn5 = lambda **kwargus : kwargus
print(fn5(name = 'ivy',age = 19))
lambda的应用
fn1 = lambda a,b : a if a > b else b
print(fn1(1, 2))

4、高阶函数

列表内字典数据排序

!!注意:lambda就和len类似,len对于字符串来说,是一个一个len(‘字符串’)把他们对应的长度都取出来,然后sort执行排序,lambda就是把字典里对应关键字的value一个一个取出来而已

students = [
    {"name": "Tom", "age": 20},
    {"name": "Jerry", "age": 18},
    {"name": "Alice", "age": 22},
]
students.sort(key = lambda x : x['name'])  # 交给 sort,让它自己调用
print(students)
abs( )和round( )

abs():完成求绝对值计算        round():完成对数字的四舍五入计算

def add(a,b,f):
    return f(a)+f(b)
print(add(1,-2,abs))
map( )

map():map(func,list),将传入变量func作用到list变量的每个元素中,并将结果迭代器返回

def func(a):
    return a**2
list1 = [1,2,3,4]
result = map(func,list1)
print(result)
print(list(result))
reduce( ):要导入模块functools

reduce():reduce(func,list),其中func必须有两个参数。每次func计算的结果继续和序列下一个元素做累积计算,!!注意:reduce的第一步会取两个元素,然后每一轮是用上一步的运行结果和下一个数据进行计算

import functools
list1 = [1,2,3,4,5]
def func(a,b):
    return a+b
result = functools.reduce(func,list1)
print(result)
filter( )

filter():用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象,如果要转换成列表可以用list( )

list1 = ['jinny','xiu','alyce','betty','ivy','qiana','lulu']
def func(x):
    return len(x) == 5
result = filter(func,list1)
print(list(result))

十三、文件操作

文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力

1、文件操作步骤

打开

open():open( name,mode ),如下此时f是open函数的文件对象

f = open('test.txt'.'w')

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)

mode:设置打开文件的模式(访问模式):只读、读写、追加等,如果访问模式省略表示访问模式为r只读

主访问模式 r,w,a

r只读:如果文件不存在,报错,不支持写入操作,表示只读

w只写:如果文件不存在,新建文件,如果执行写入,会覆盖原有内容

a追加:如果文件不存在,新建文件,如果执行写入,在原有内容基础上追加新内容

写write()
读read(),readlines(),readline()

文件对象.read( ),括号里可以有参数,代表多少个字节,文件如果换行会有\n字节占位情况

f = open("test.txt","r")
print(f.read(10))

readlines是一行一行读取的,返回由多个行组成的列表,每一行数据为一个元素返回结果如下

['hello world\n', 'aaa\n', 'bbb\n', 'ccccc\n']

readline一次读一行,返回一行数据

访问模式拓展 r,rb,r+,rb+,w,wb,w+,wb+,a,ab,a+,ab+

b是以二进制格式打开的意思, +是可读可写的意思

r开头为拓展的,要和r只读一样,如果文件不存在要报错

w+模式下读取时,因为什么都没有输入,覆盖了之前文件里的内容,所以读出来是空的,一下这个代码运行结果是空的

f = open("test.txt","w+")
result = f.read()
print(result)
f.close()

a+模式下读取时,因为文件指针在结尾,无法读取数据

seek()函数

用来移动文件指针的位置,        文件对象.seek(偏移量,起始位置)  起始位置:0开头1当前2结尾

f = open("test.txt","r+")
f.seek(2,0)
result = f.read()
print(result)
f.close()

2、文件备份

规划文件名

用户当前目录下任意文件名,如果想要给他备份的话,类似这样 test[备份].txt

步骤:接收用户输入的文件名;规划备份文件名;备份文件写入数据(和原文件一样)

!!注意:在给文件备份的时候,我们要找到文件后缀与文件名之间的那个点,然后用原名字+[备份]+后缀结合为备份,我们找点的时候用rfind从右侧开始找,原名字其实就是整个文件名的一个字串,这里我们用切片,切片的语法是字符串['开始下标':‘结束下标’:步长]

old_name = input('请输入想要备份的文件名:')
index = old_name.rfind('.')
print(old_name[:index])
print(old_name[index:])
new_name = old_name[:index]+'[备份]'+old_name[index:]
print(new_name)
文件备份写入数据

如果不确定目标文件大小,我们循环读取写入,如果读取出来的数据没有了(len==0),退出循环

old_name = input('请输入想要备份的文件名:')
index = old_name.rfind('.')
new_name = old_name[:index]+'[备份]'+old_name[index:]
print(new_name)
old_f = open(old_name,'rb')
new_f = open(new_name,'wb')
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)
old_f.close()
new_f.close()

!!思考:如果输入的文件是这种 .txt 这种无效的文件名,需要弹一个报错来限制一下,这个时候需要判断是否index > 0,下面是改进后的代码

old_name = input('请输入想要备份的文件名:')
index = old_name.rfind('.')
if index > 0:
    postfix = old_name[index:]
# new_name = old_name[:index]+'[备份]'+old_name[index:]
new_name = old_name[:index]+'[备份]'+ postfix
print(new_name)
old_f = open(old_name,'rb')
new_f = open(new_name,'wb')
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)
old_f.close()
new_f.close()

3、文件和文件夹的操作

文件操作rename(),remove()

注意rename既可以完成文件重命名也可以完成文件夹重命名

在python中文件和文件夹的操作要借助os模块里的相关功能,所以要导入os模块

remove的时候如果文件不存在会报错

import os
os.rename('77.test','77.txt')
import os
os.remove('test[备份].txt')
文件夹操作创建和删除mkdir(),rmdir()

mkdir(文件名):make directory创建文件夹,如果文件夹已经存在会报错

import os
os.mkdir('dictory')

rmdir(文件名):remove directory删除文件夹,如果文件夹不存在会报错

import os
os.rmdir('dictory')
路径相关函数getcwd(),chdir(),listdir()

getcwd():get current working directory获取当前工作目录所在路径

import os
print(os.getcwd())

# 结果E:\Py_project\project1

chdir():切换当前的文件目录,如要在别的文件目录下创建文件或文件夹,要先切换当前文件目录

import os
os.chdir('test')    # 把当前文件目录切换到test
os.mkdir('dir_in_test')    # 在test文件夹下面创建文件夹

listdir():获取目录列表,也可以写参数,比如listdir(‘test’),这样就会返回我上面刚刚创建好的dir_in_test这个文件夹

import os
print(os.listdir())

#运行结果
['.idea', '.venv', '77.txt', 'info_stu.py', 'main.py', 'sound.txt.mp3', 'test', 'test.py']

4、应用案例--批量重命名

以下代码在当前列表所有的文件夹前面加上了Python_,属于添加指定字符串

删除Python_重命名

import os
files = os.listdir()

for i in files:
    new_name = 'Python_' + i
    os.rename(i,new_name)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐