默认参数和关键字参数
def func(name,age=50):# 默认参数 默认参数要放到普通参数后面
print(name,age)
func('张三') #调用时不输age,默认为50,输入则按输入值传入
func('张三',100)
# func(name='张三',age=40)# 关键字参数 调用的时候可以打乱顺序
func(age=40,name='王五')
可变参数
可变参数任然放到普通参数后边
•可变参数args是将参数包装成元组tuple
•可变参数kwargs是将参数包装成字典
传元组到args,传字典到kwargs
实参中的args和kwargs解包:
•在实参的前面加上*的作用是将元组中的元素解包成一个一个的元素传递给函数.
•对于元组列表以及集合都可以使用*
•在实参的前面加上**的作用是将元组中的元素解包成一个一个的不存在的关键字参数传递给函数.
•注意:如果字典前面加上*表示的是将字典的key值解包出来
def func1(*args,**kwargs):
print('func1------')
print(args)
print(kwargs)
def func2(*args, **kwargs):
print('func2------')
print(*args)
print(*kwargs)
# 调用func1 把数据传递过去
func1(*args,**kwargs)
func2(10,20,30,name='张三',age = 30)
'''输出func2------
10 20 30
name age
func1------
(10, 20, 30)
{'name': '张三', 'age': 30}'''
高阶函数
sort() map() filter() reduce()
map()
# 传递函数参数还有容器
# 把容器中每一个元素通过函数处理 返回新的元素
# 所有的元素组成一个新的容器
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# l = [1,4,9,16,25,36]
def func(ele):
return ele**2
newR=map(func,l) #newR是一个新的容器,直接打印是一个内存地址
filter()
#用法和map类似,输出符合判断的元素
l = ['林青霞','张曼玉','胡慧','高圆圆','张曼玉']
def func(ele):
return ele=='张曼玉' #输出['张曼玉','张曼玉']
#def fun(ele):
# return len(ele)==2 输出['胡慧']
r = filter(fun,l)
文件IO
文件打开关闭
'''
r以及r+模式打开,如果文件不存在,就会报错
w和w+ 如果文件不存在,就创建 存在,就覆盖
a会创建 不会覆盖
'''
f = open('a.txt','a+',encoding='utf-8')
# 获取文件名
# print(f.name)
# print(f.mode)
# print(f.closed)
print(f.readable())
print(f.writable())
print(f.encoding)
f.close()
# print(f.closed)
文件访问模式:
功能 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
file对象的方法和属性
方法或属性 | 说明 |
---|---|
name | 返回文件的名称 |
mode | 返回文件的访问模式 |
closed | 文件是否已经关闭 |
readable() | 文件是否可读 |
writable() | 文件是否可写 |
encoding | 文件编码 |
读写数据
写:write(str)
writelines(Iterable[str]) 可以将容器中数据写入到文件中,注意:参数必须是可迭代的,包括字符串、列表、元组、集合以及字典
f = open('a.txt','a')
"""---------------------------- write方法 ----------------------------"""
# 写入数据
f.write('hello')
"""---------------------------- writelines ----------------------------"""
# 容器中元素必须是字符串
# f.writelines(['aaaaaaahello','hi','hah12a'])
f.close()
读数据:
data = read(num)
data = f.readline(num)
list = f.readlines(num)
读写练习:
'''输入文件的名字,然后程序自动完成对文件进行备份(相对大文件)'''
# 1.输入文件名
name = input('请输入文件名:')
# 2.打开a.txt
rf = open(name)
# 3.打开a[复制].txt
index = name.rfind('.')
newName = name[:index]+'[复制]'+name[index:]
# print(newName)
wf = open(newName,'w+')
# while True:
# # 4.读取a.txt
# line = rf.readline()
# # 5.写入到a[复制].txt
# wf.write(line)
# if not line:
# break
# 4.读取a.txt
line = rf.readline()
while line:
# 5.写入到a[复制].txt
wf.write(line)
# 读取下一行
line = rf.readline()
# 6.关闭a.txt以及a[复制].txt
rf.close()
wf.close()
'''输入一个文件名,统计文件中代码行数、注释行数、空行数
并输出代码以及注释'''
# 1.输入文件名
name = input('请输入文件名:')
# 2.打开文件
f = open(name,encoding='utf-8')
# 定义容器
codes = []
comments = []
blanks = []
# 3.按行读取 判断是代码还是注释还是空行
line = f.readline()
while line:
# 是否是空行
_line = line.strip()
if not _line:
blanks.append(line) #判断是否是空行经常用到
elif _line.startswith('#'):
comments.append(line)
else:
codes.append(blanks)
line = f.readline()
print('代码行数:%d'%len(codes))
print('注释行数:%d'%len(comments))
print('空行数:%d'%len(blanks))
# 关闭文件
f.close()
读写指针
获取读写位置 index=f.tell()
定位到某个位置读写 index = f.seek(offset,whence)
offset:偏移量 whence:方向0文件开头,1当前位置,2文件末尾
•如果需要从某一个位置进行读写的话,可以使用seek()将文件指针移动到指定位置
f = open("123.txt", "w+")
f.write("hello world")
# 获取指针位置
index = f.tell()
print(index)
# 指针放到开始位置
# 向左偏移为负 向右偏移为正
f.seek(6,0)
content = f.read()
print(content)
f.close()
'''输出
11
world
'''
相对路径和绝对路径
乱码 encoding=‘UTF-8’
文件夹操作
'''定义一个方法,传递路径,可以列举出当前路径下所有的文件(包括文件夹下文件)
'''
import os
def getFiles(path):
# 定义列表
files = []
'''列举当前路径下所有的文件'''
# 列表保存文件
dir = os.listdir(path)
for ele in dir:
newPath = os.path.join(path, ele)
# 保存文件
if os.path.isfile(newPath):
files.append(newPath)
else:
files += getFiles(newPath)
return files
print(getFiles('./'))
对象和类
class 类名:
…
对象名=类名()
实例属性和私有方法:
对象名.属性=… 成员属性:在类里面定义
成员方法定义:def 函数名(self):
class Person:
def __init__(self,age,name):
self.__age = age #加上两个下划线__后变成私有属性,只能在类里面访问和修改
self.name=name #成员属性
def setAge(self,age): #私有属性想从外部修改必须通过这个函数进行修改
'''修改age'''
if age>0 and age<150:
self.__age = age
print(self.bianliang1) #如果对象没有执行printAge函数,则这里不能直接调用self.bianliang1这个变量
def printAge(self):
A=self.__getAge()
print(A)
B=self.phone1 #类里面可以通过self调用外部定义的实例属性
print(B) #输出654321
#C=self.__phone2 #会报错没有定义__phone2,应为其在外定义为实例私有属性
#print(C)
self.bianliang1=6666
def __getAge(self): #私有方法只能在类内部访问,而且类内定义所有的方法函数的顺序没有要求,
#所以上面函数可以调用下面的函数
return self.__age
p = Person(30,'李三')
print(p.name) #输出‘李三’,成员属性在外部可以访问
print(p.__age) #### 报错!!!!!私有属性在外不可访问
p.phone1=654321
p.__phone2=123456
#此时__age=30
p.setAge(100)
#此时__age=100
p.printAge()
'''输出结果为
李三
100
654321'''