Python学习【3】

str不可更改,无非就是更新覆盖原来的str
字典是无序的【哈希算法】

集合set {}

去重、关系测试

list_1 = [1,2,3,3,2,1]
list_1 = set(list_1)
print(list_1,type(list_1))
{1, 2, 3}

关系测试~~~

交集
list_1.intersection(list_2)
并集
list_1.union(list_2)
差集[list_1去除和list_2重复的部分] in list_1 but not in list_2
list_1difference(list_2)
子集
list_1.issubset(list_2)#判断lst_1是不是list_2的子集
父集
list_1.issuperset(list_2)#判断list_1是不是list_2的父集
对称差集
list_1.symmetric_difference(list_2)#并集减去交集

list_1.isdisjoin(list_2)#交集为空则返回True


用运算符进行关系测试

list_1 & list_2#交集
list_1 | list_2#并集
list_1 - list_2#差集,在list_1中,不在list_2中
list_1 ^ list_2对称差集#并集减去交集


基本操作

list_1.add(0)#添加一项
list_1.update([1,2,3])#添加多项
list_1.remove(0)#删除指定,找不到报错
len(list_1)#长度


x in s 测试成员,列表,集合,字典,字符串,全是这么判断成员在不在。
x not in s
list_1.pop()#删除任意一个,并返回
list_1.discard(0)#删除指定,找不到不报错

文件操作

文件操作流程

1、打开文件,得到文件句柄并赋值一个变量
2、通过句柄对文件进行操作
3、关闭文件


三种模式,r\w\a,只读,只写,追加。
f = open(“yesterday”,’r’,encoding = “utf-8”)默认读模式,只读


打开文件,并赋值,f称为文件句柄【文件内存对象】,通过f访问内存中的文件对象
f.read()读取文件,只能读一遍,指针光标从开始移动到最后,再次read为空
windows默认gbk编码


f = open(“yesterday,’w’,encoding = “utf-8”)#写模式,创建一个写模式,重名的话覆盖,原来文件内容都没了,否则新建一个空的文件,只写。
f.write(“Hello,World\n”)#写进文件,原来的文件内容都没了。


f = open(“yesterday,’a’,encoding = “utf-8”)#a代表append的意思,文件最后追加。
f.write(“Hello,World”)#追加到最后,不覆盖原来的内容。


f.readline()每次读一行
f.readlines()将整个文件返回一个列表,每行作为一个列表的元素。


low loop,占用内存大
for index,line in enumerate(f.readlines()):
if index ==9:
continue
print(line.strip())
f.readlines()由于是一次性读取整个文件,转化成列表,所以只适合读取小文件。


high loop,只保存一行,占用内存极小,迭代器
count = 0
for line in f:
if count == 9:
conut+=1
continue
print(line)
count+=1


f.close #关闭文件
f.tell() #打开文件之后,查看文件光标。也就是句柄指针所在的位置,返回的是字符个数
f.read(50) #读取前50个字符
f.seek(0) #指针返回到第0个字节,移动光标到指定个数字符处
f.encoding #打印文件编码
f.name #文件名字
f.seekable() #判断能不能移动光标
f.flush() #刷新内存到硬盘上,可用于实时刷新
一般操作系统会等缓存区满了再写入硬盘


进度条小程序
import sys,time
for i in range(20):
sys.stdout.write(“#”)
sys.stdout.flush()#刷新内存,也就是立刻将缓存区的内容写到硬盘,不懂等缓存区满了再一起写。
time.sleep(0.1)#延时


f.truncate(10) #截断,无论光标在哪,都是从头开始截断10个字符


f = open(“yesterday”,’r+’,encoding=’utf-8’) # r+,读写,读和追加的模式,写在最后位置
f = open(“yesterday”,’w+’,encoding=’utf-8’) # w+,写读,先创建文件,再写,没什么卵用
f = open(“yesterday”,’a+’,encoding=’utf-8’) #a+, 追加读,在最后面追加,可以读。
f = open(“yesterday”,’rb’) #rb,二进制读取文件,用于网络传输,视频
f = open(“yesterday”,’wb’) #wb,二进制写文件
f.write(“hello,world\n”.encode()) #编码转化
Python3.0将二进制和字符串严格区分


文件修改:
vim 内容先加载到内存,修改,然后将内存写到原文件。


不修改原文件,将修改后的文件写到一个写的文件内
f = open(“yesterday2”,”r”,,encoding=”utf-8”)
f_new = open(“yesterday2.bak”,”w”,encoding=’utf-8’)
for line in f:
if “old” in line:
line = line.replace(“old”,”new”)
f_new.write(line)
f.close()
f_new.close()


或者进阶版:通过脚本传递参数
import sys
f = open(“yesterday2”,”r”,,encoding=”utf-8”)
f_new = open(“yesterday2.bak”,”w”,encoding=’utf-8’)


find_str = sys.argv[1]
replace_str = sys.argv[2]


for line in f:
if find_str in line:
line = line.replace(find_str,replace_str)
f_new.write(line)
f.close()
f_new.close()


with语句

为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open(“yesterday2”,”r”,encoding=”utf-8”) as f:
for line in f:
print(line)


可以同时多个文件:
with open(“file1”) as f1,open(“file2”) as f2:
pass


Python规范,一行代码不要超过80个字符。建议下面格式:
with open(“file”) as f1,\
open(“file2”) as f2:
pass


字符编码与转码

windows中文默认gbk
ASCII英文一个字节,无中文
unicode 统一两个字节【英文浪费空间】
utf-8可变长度的,英文按照ASCII存储【一个字节】,中文【三个字节】
python3默认unicode,万国码,兼容其他的编码方式,python2默认ASCII
Pyhthon3中encode的时候,会转化成Byte格式。
这里写图片描述

函数

面向对象编程:–》类–》class
面向过程编程:– 》过程–》def
函数式编程:–》函数–>def


函数是把逻辑给结构化和过程化的一种编程方法
def test(x):
“The function definitions”
x+=1
return x


定义函数:
def func1():
print(“heimu”)
return 0


定义过程:
def func2():
print(“heimu”)
调用:
x = func1() #0
y = func2() #None
过程实际上就是没有返回值的函数而已


但是在Python中默认给过程返回值为None,所以二者区别没那么大


为什么使用函数?减少重复代码,便于修改,可扩展。


打印时间
import time
time_format = ‘%Y-%m-%d %X’
time_current = time.strftime(time_format)
print(‘%s’ % time_current)


def test1():
print(‘heimu’)
return 0 #到这函数结束
print(‘kobe’) #不执行


函数返回值详解:

def test1():
print(“test1”)
def test2():
print(“test2”)
return 0
def test3():
print(“test3”)
return 1,’hello’,[‘heimu’,’kobe’],{‘name’:’heimu’}
x = test1 #None
y = test2 #0
z = test3 #(1,’hello’,[‘heimu’,’kobe’],{‘name’:’heimu’})


总结:
返回值数=0,返回None
返回值数=1,返回object
返回值数>1,返回tuple(系统打包起来,放到一个元组)


函数参数详解:

def test(x,y):
print(x)
print(y)
test(y=2,x=1) #关键字参数,与形参顺序无关
test(1,2) #位置参数,与形参一一对应
test(x=2,3) #错误,关键字参数一定不能放在位置参数前面。
test(1,y=2,3) #错误,关键字参数一定不能放在位置参数前面
test(1,z=3,y=2) #正确
总结:位置参数一定要放在关键字参数前面


默认参数

def test(x,y=2):
print(x)
print(y)
test(1) #正确
默认参数特点:调用函数的时候,默认参数可有可无,非必须传递,


参数组:
*args,接受多个参数,放到元组中
**kwargs,接受关键字参数,放到字典中


第一种方式
def test(*args):
print(args)

test(1,2,3,4,5)
test(*[1,2,3,4,5]) # args=tuple([1,2,3,4,5])


第二种方式
def test(x,*args):
print(x)
print(args)
test(1,2,3,4,5)

打印结果:
1
(2,3,4,5)


第三种方式,**kwargs:把n个关键字参数转变成字典的方式
def test(**kwargs):
print(kwargs)
print(kwargs[‘name’])

test(name=’heimu’,age=22,sex=’f’) #上下两种方式一样
test(**{‘name’:’heimu’,’age’:22,’sex’=’f’})
打印结果:
{‘name’:heimu,’age’:8,’sex’:’f’}


第四种方式,结合位置参数
def test(name,**kwargs):
print(name)
print(kwargs)

test(‘heimu’,age=22,sex=’m’)


第五种方式,结合默认参数
def test(name,age=18,**kwargs): #**kwargs放到最后
print(name)
print(age)
print(kwargs)

test(‘heimu’,sex=’m’,age=3) #关键字参数位置不重要,无所谓


第五种方式
def test(name,age=18,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs)

test(‘heimu’,22,3,4,sex=’h’,poe=’a’)
heimu
22
(3, 4)
{‘sex’: ‘h’, ‘poe’: ‘a’}


*args:接受n个位置参数,转换成元组
**kwargs:接受n个关键字参数,转化成字典
位置参数一定不能写到关键字参数后面

局部变量与全局变量

函数内部的变量只在函数内部可以使用,作用域只限于函数内部,局部变量
代码顶层定义的变量为全局变量

name = ‘heimu’
def change_name():
global name
name = ‘kobe’

change_name()
print(name)
kobe


global school #函数内部定义为全局变量,这样可以在函数内部更改全局变量。
上面方法可行,但是不建议,不要在函数内部更改全局变量,易于混乱

name = [‘heimu’,’wade’]
def change_name():
name[0] = ‘kobe’

name
[‘heimu’, ‘wade’]
change_name()
name
[‘kobe’, ‘wade’]

除了字符串和整数,列表,字典,集合,类都可以在函数内部通过直接改。
总结:函数中定义的变量为局部变量,作用域为函数,顶层定义的变量为全局变量
当局部变量与全部变量重名时,函数内部,局部变量生效,出了函数,全局变量生效。


递归:

在函数内部,可以调用其他函数,如果一个函数在内部调用自己,这个函数就是递归函数。
递归特性:
1、必须有明确的结束条件
2、每次进入更深一层次递归时,问题规模相比上一次递归有所减少
3、递归效率不高


demo

def calc(n):
print(n)
if int(n/2 )> 0:
return calc(int(n/2))

calc(10)
10
5
2
1

高阶函数:

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接受另一个函数作为参数,这种函数就称为高阶函数。

demo

def add(x,y,f):
return f(a)+f(b)
res = add(3,-6,abs)
print(res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值