1. 文件读写:b模式
import requests
url = 'http://www.nnzhp.cn/wp-content/uploads/2018/01/601a335c499837a995ae10867fc36101.png'
img = requests.get(url).content f = open('hhh.jpg', 'wb') # bytes:以二进制模式打开,有wb、rb、ab组合
f.write(img)
拓展:
f = open('haha.txt','w')
f.write('test')
# 不加下面这个这句,有时会在文件中看不到写入的数据,是因为有缓冲区,它会等缓冲区数据存储到一定的值才会写入到磁盘
f.flush() #立即把缓冲区的内容写到磁盘里面。
time.sleep(50)
with open('b.txt') as f,open('c.txt') as fc:#自动关文件指针;一个with可以打开多个文件,逗号隔开即可。
f.write('aaa')
2. 修改文件的2种方式:
# 粗暴直接,适用于小文件,内容少
with open('geci','a+',encoding='utf-8') as f:
f.seek(0)
all = f.read()
new_all = all.replace('二','一')
f.seek(0)
f.truncate()
f.write(new_all)
f.flush()
# 替换一个文件中的内容,直接修改文件不好实现,一般把修改后的文件内容保存到bak文件,删除原来文件,rename bak文件。
# .**文件是隐藏文件
with open('geci.txt', 'r+', encoding='utf-8') as f, open('.geci.bak', 'w', encoding='utf-8') as ff:
for i in f:
newline = i.replace('一', '二')
ff.write(newline)
os.remove('geci.txt')
os.rename('.geci.bak', 'geic.txt')
3. 函数
# 函数:就是把一堆代码组合到一起,变成一个整体
# 提高代码的复用性
# def hello(filename,content): 这种是位置参数,必填参数
# def hello(filename,content='ceshi'): # 默认值参数,非必填
def hello(filename,content=''): #形参
with open(filename,'a+',encoding='utf-8') as f:
if content:
f.write(content)
else:
f.seek(0)
res = f.read()
return res
print(hello('demo.txt')) #实参
# return 立即结束函数
print(hello('demo.txt','1243')) #函数没有写return的话,返回值是None,返回值不是必须写的,需要获取函数返回值再写
a = 100
可变参数
# 可变参数,*args
def test(a,b=1,*args):
# print("a",a)
# print("b", b, type(b))
print('args',args)
test("haha")
# 如果后面有多余的参数,会把它保存到args元组中
test("haha",'22','1','2')
关键字参数
# 关键字参数
def test2(a, **kwargs):
print('a:',a)
print(kwargs)
test2(a=1,name='test') # {'name': 'test'}
练习题
print('-1'.isdigit()) # 判断一个字符串是否是纯数字
# 1.写一个校验字符串是否为合法的小数
# 0.88
# -0.99
def check_float(num):
str_num = str(num)
print("str_num:",str_num)
if str_num.count('.') == 1:
left = str_num.split('.')[0]
right = str_num.split('.')[1]
print("left %s;right %s" % (left,right))
if left.isdigit() and right.isdigit(): # 正小数
return True
elif left.startswith('-') and left.count('-') == 1:
if left.split('-')[-1].isdigit() and right.isdigit():
return True
return False
print(check_float('-1.-1')) # 这里如果直接传float型数字,传参过程中会自动给把数字给你转型。
4. 模块
# 一个Python文件就是一个模块
# 1.标准模块
# python自带的,不需要安装
# 2.第三方模块
# 手动安装
# # 首先下载安装包
# 解压
# 在命令行里面进入到这个解压之后的目录(windows下如何快速进入cmd命令窗口:按住shift+右键:在此处打开命令窗口)
# 执行python setup.py install
#
# 3.自己写的python文件
# import xx 导入一个文件的实质:把这个python文件运行一次
# import hahaha
# import 导入文件时,首先从当前目录下找这个文件
# 然后从python的环境变量中寻找
# 环境变量是让在任何目录下都能使用这个命令
import sys
print(sys.path) # 查看系统的环境变量,在pycharm下执行这句,会把工程根目录也打印出来,这是pycharm自动加上的。
5. 递归
# 递归:自己调用自己
count = 0
def test1():
global count
count += 1
# num = 8
# num = int(input('please enter a number:'))
# if num%2==0:# 判断输入的数字是不是偶数
# return True # 如果是偶数的话,程序就退出了,返回true
print('不是偶数请重新输入!')
return test1() # 如果不是偶数的话继续调用自己,输入值
print(test1()) # 调用test
# 用递归能实现的用循环都能实现,但最好不用递归,效率较低。
# 递归最多递归999次
6. 集合
# 集合,天生去重
# 集合的作用:
# 1、它可以把一个列表中重复的数据去掉,而不需要你再写判断
# 2、可以做关系测试,比如说有两个班,一个性能测试班,一个是接口测试班的,想找出来既学习了性能又学习了接口测试的同学,就可以用集合
li = [2, 3, 1, 2, 3, 4]
s_list = set(li) # 这样就定义了一个集合
set1 = set([1, 3, 4, 5, 6]) # 这种方式和上面的都是把list转换成一个集合
set2 = {'hehe', 'hehe1', 'hehe3'} # 直接定义一个集合
s = set()
s2 = {'1', '2', '3', '4'}
# 集合是无序的,没有办法通过下标取值
s2.add('5')
s2.add('1')
s3 = {'1', '2'}
print(s2.intersection(s3)) # 取交集,生成了1个新的集合,不会修改原来的集合
print(s2)
print(s3)
# print(s3 & s2) # 取交集
#
# print(s3.union(s2)) # 取并集
# print(s3 | s2) # 取并集
#
# print(s2.difference(s3)) # 在s2中存在,在s3中不存在
# print(s2 - s3) # 取差集