初识Python

介绍

Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

特点

Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
Python 是交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序。
Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。

基本知识点

Python3.X 源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。

#变量
FirstName = 'zhang'
print(FirstName)

#数字
num = 10
print(num)
print(0.1+0.2)

#字符串
str1 = "Dava:\"this is my house\""
print(str1)
str1 = '''邢晓红
我们会一直一直在一起的'''
print(str1)
print('\u0079')
a,b,c = 1,2,3
print(a,b,c)

#格式化字符串
name = "star"
age = 15
#=====方法一======
#字符串和数字不能直接进行拼接,否则会报错
print("姓名:" + name)
#=====方法二======
print("姓名:" + name + "年龄:" , age)
#=====方法三======
#占位符
#小数保留
str1 = "每个月工资是%.1f"%65.25
#取整
str1 = "每个月工资是%d"%643355.25
#字符
str1 = "我家住在%3.5s"%"rtertre"
print(str1)
print("姓名:%s,年龄:%s"%(name,age))
#=====方法四======
print(f"姓名:{name},年龄:{age}")

#字符串复制
str1 = 'abc'
str1 *= 20
print(str1)

#布尔值,也是一个整型
print(1 + True)
print(1 + False)

#type函数用于变量类型检查
print(type('hello'))
print(type(123))
print(type(13.14))
print(type(True))
print(type(None))

#获取对象在内存中的地址ID
print(id(123))

#类型转换
#int() float() str() bool()
a = '123'
a = 11.1
#a = 'abc'
a = True
a = False
#a = None
a = int(a)
a = float(a)
a = str(a)
a = bool(a)
print("a=",a)
print(type(a))

#运算符
a = 10 // 3
a = 10 ** 2
a = 10 % 3
a += 5
a -= 2
a *= 5
a **= 2
a /= 5
a //= 5
print(a)

#关系运算符
result = 1 > 2
result = 1 < 2
result = 1 <= 2
result = 1 >= 2
result = 1 < True
result = 1 == True
result = 1 != 2
#字符串比较的是unicode编码,而且是逐位进行比较
result = '2' > '1'#True
result = '2' > '11'#True
#以上比较的是对象的值,要想比较对象的id,需要使用is,is not
result = 1 is 2 #False
result = 1 is not True #True
#python中支持连着的写法,拿着中间值分别去与两边值进行比较
result = 10 < 15 > 13 # True 相当于10 < 15 and 15 > 13
print('result=',result)

#逻辑运算符
#not 非 取反
#and 与 有一个False就是False,第一个是False则不看后面的
#or 或 有一个True就是True,第一个是True则不看后面的
a = True
a = not a
a = True and True
a = True and False
a = True or False
print('a=',a)
#非布尔值与或运算,按照布尔值去进行计算,直接返回原值
a = 1 and 2 #2
a = 1 or 2 #1
a = 0 and 2 #0
a = 0 or 1 #1
print(a)
#优先级 not > and > or
a = 1 or 2 and 3 or not 4
print(a)

#条件运算符
#三元运算符
a = 20
b = 30
c = 15
max = a if a > b else b
min = a if a < b and a < c else b if b < c else c
print(max)
print(min)


#======================================================================================


#流程控制语句
#if判断
num = 11
if num > 10:
	print('num大于10')

#input函数用于获取用户输入,调用的时候程序会立即暂停,等待用户输入,回车后程序继续向下执行,返回值为一个字符串
a = input()
if a == "admin":
	print("欢迎管理员登录")
elif a == "star":
	print("欢迎用户登录")
else:
	print("欢迎游客登录")

#循环语句
#while循环
i = 0
while i < 10:
	print('你在想我吗?')
	i += 1
else:
	print("i不小于10")

#循环嵌套,形成99乘法表
i = 0
while i < 9:
	i += 1
	j = 0
	while j < i:
		j += 1
		print(f"{j}*{i}={i*j}",end=' ')
	print()	
	
#break 终止循环并跳出,包括else 
#continue 跳过本次循环
#pass 用于占位
i = 0
while i < 5:
	i += 1
	if i == 3:
		#break
		#continue
		pass
	print(i)

#引入time模块用于获取当前时间,单位是秒
from time import *
start = time()

#获取质数,只能被1和本身整除
i = 2
while i < 100:
	flag = True
	j = 2
	while j <= i**0.5:
		if i % j == 0:
			flag = False
			break
		j += 1
	if flag:
		print(i)
	i += 1
end = time()
print(f'{end-start}')
print('\tm')

#==================================================================================
#数据结构指计算机中数据存储的方式
#序列
#列表,可改变的序列
lst = [1,2,3,4,5]
#可以进行加法和乘法运算
lst = [1,2,3,4,5] + [6,7,8,4]
lst = lst * 2
print(lst)
print(type(lst))
#获取某个下标对应的元素
print(lst[3])
#通过切片获取指定的元素,获取到的数据会组成一个新的列表,不会影响原来的列表
#切片的获取包含开头,不包含末尾,如果其中一项不写,则表示从0开始取或者取到最后一位
#其中第三个参数为步长,可以控制怎么取
print(lst[1:3:1])

#列表操作
#获取列表长度
print(len(lst))
#in,not in判定元素在不在列表中
print(1 in lst)
print(3 not in lst)
#min,max获取列表中元素的最大值和最小值
#print(min(lst))
#print(max(lst))
#index获取索引值,第一个参数是指定元素,第二个参数是从哪个下标开始查找
print(lst.index(2,3))
#count获取当前元素出现的个数
print(lst.count(2))
#通过索引修改列表对象
lst[1] = 3
#del删除
del lst[1]
print(lst)
#通过切片来修改列表
lst[0:2] = [11,12]
print(lst)
#插入元素
lst[0:0] = [13]
lst[5:5] = [15]
#如果设置了步长,则序列中的个数必须与切片中的个数一致
print(len(lst[::6]))
lst[::6] = [1,2,3,4]
print(lst)
#删除元素
del lst[0:2]
lst[0:2] = []
#以上操作仅适用于可变序列
s = 'hello'
#s[::2] = [1,2]
print(s)
#列表方法
#append向列表末尾添加元素
lst.append(520)
#insert向指定位置插入元素
lst.insert(2,1314)
#extend使用新的序列来扩展当前序列
lst.extend([1,2,34])
#clear清空序列
#lst.clear()
#pop删除指定序列,不写参数则默认删除最后一个,并返回删除元素
lst.pop()
#remove删除指定元素,只删第一个
lst.remove(1)
#reverse用于翻转列表
lst.reverse()
#sort排序,默认为升序排列
lst.sort()
#reverse = True可改为降序排列
lst.sort(reverse = True)
print(lst)

#for循环遍历列表
for s in lst:
	print(s)

#range函数会自动生成一个由自然数组成的序列,通常和for循环一起使用,用于循环指定次数
#有3个参数,起始值,终止值,步长
range(0,9,3)
for i in range(5):
	print(i)
#字符串和元组,不可改变的序列

#元组和列表的方法大部分相同,只不过不能进行修改操作
tuple = (10,20,30,40)
print(tuple,type(tuple))
#非空元组,可以不加括号,但是里面必须有一个,
tuple = 10,20,30,40
print(tuple,type(tuple))
tuple = 10,
print(tuple,type(tuple))
#元组解构
a,b,c,d = (10,20,30,40)
print(a,b,c,d)
#*c可以取到元组剩余所有元素组成的列表
a,b,*c = (10,20,30,40)
print(a,b,c)
#值的交换
a = 10
b = 20
a,b = b,a
print(a,b)

# == != is is not
# == !=比较的是值
# is is not比较的是id
a = [1,2,3]
b = [1,2,3]
print(a == b) #True
print(a is b) #False
b = a
print(a is b) #True

#===========================================================
#字典dict
#一种新的数据结构=>映射
#以键值对(key-value)的形式存在,由于key的唯一性,相较于序列,更容易索引
#创建字典
d = {'name':'晓红','age':'24'}
#dict函数创建
d = dict(name='xiaohong',age='15')
#双值子序列转换
d = dict([('name','xiaohong'),('age','15')])
print(d)
#获取键值对的个数
print(len(d))
#获取值
print(d['name'])
print(d.get('nama','默认值'))
#设置值
d['name'] = 'star'
#若key值已存在,不会对字典做任何操作
d.setdefault('name','xiaohong')
print(d)
#添加值
d['sex']='男'
d.setdefault('address','临涧')
print(d)
#更新合并,如果键重复,拿后面的替换前面的
d1 = {'love':'xiaohong','job':'web','name':'yixuan'}
d.update(d1)
print(d)
#删除
d = {'a':1,'b':2,'c':3,'d':4,'f':5}
#del
del d['c']
#popitem删除字典最后一项,返回值是删除的key和value组成的一个元组
result = d.popitem()
print(result)
#pop删除指定项,设置默认值可删除不在字典中的key,返回值是删除的值
result = d.pop('a')
print(result)
d.pop('m','默认值')
#clear清空字典
d.clear()
print(d)

#copy浅复制,只复制第一层,第一层下面的值如果是可变对象,则无法复制下面的东西
d = {'a':1,'b':{'name':'晓红'},'c':3,'d':4,'f':5}
d2 = d.copy()
d2['b']['name'] = '逸轩'
print(d,id(d))
print(d2,id(d2))

#字典的遍历
d = {'name':'晓红','age':24,'love':{'name':'star'}}
#keys 返回所有的第一层的key值
for k in d.keys():
	print(k,d[k])
#values 返回所有的值
for v in d.values():
	print(v)
#items 返回所有的项,形成元组的形式构成序列
for k,v in d.items():
	print(k,v)


#集合(set)
#集合和列表相同又不同
'''
不同点:
	1、集合里面存的必须是不可变对象
	2、集合中的数据是无序的
	3、集合中不能出现重复的元素
'''
#创建空集合
s = set()
s = {1,2,3,4,5,6,12,1,3,3,4,2}
print(s,type(s))
#通过set序列、元组、字典都可以转化为集合,不过字典转化为的集合只包括键值。通过转化为集合可将序列去重
l = [1,2,3,4,5,6]
print(set(l))
t = (1,2,3,4,5,6)
print(set(t))
d = {'a':1,'b':2}
print(set(d))
#操作集合的方法
#in,not in判断元素在不在集合中
print(1 in s)
print(1 not in s)
#len获取集合中所有元素的个数
print(len(s))
#添加add
s.add(1000)
print(s,type(s))
#删除
#pop随机删除一个
s.pop()
print(s,type(s))
#remove删除指定元素
s.remove(12)
print(s,type(s))
#clear清空集合
#将一个集合更新到另一个集合中
s2 = {'a','c','v','s','a','s'}
s.update(s2)
print(s,type(s))
#copy实现浅复制
s3 = s.copy()
print(s3,type(s3))

#集合的运算
s = {1,2,3,4,5,6}
s1 = {5,6,8,3,2,5,3}
#交集 -->公共部分
result = s & s1
print(result)
#并集 -->两者所有的元素
result = s | s1
print(result)
#差集 -->自己单有的
result = s - s1
print(result)
#异或集 -->两者单有的
result = s ^ s1
print(result)
#判断一个是另一个的子集
print(s <= s1)
#判断一个是另一个的超子集)
print(s < s1)
#判断一个是另一个的父集
print(s >= s1)
#判断一个是另一个的超父集
print(s > s1)

#================================================================================

#函数
#混合参数时,位置参数要放在关键字参数的前面
def fn(a,b,c=20):
	print(a+b+c)
fn(1,c=2,b=3)
#参数为可变对象的时候,在函数内改变对象,函数外部也会跟着变化,因为两者指向的是同一地址,要想外部不做改变,可以采用copy的方式,对对象进行浅拷贝
def fn1(a):
	a[0] = 10
	print(a)
c = [1,2,3]
fn1(c.copy())
print(c)
#不定长形参
#装包
# * 指代未明确标出来的位置参数,所有被指代的实参将组成一个元组,只能有一个,可以放在任意位置,但是其后的其他参数必须得用关键字参数
def fnsum(*a):
	print(a,type(a))
	result = 0
	for num in a:
		result += num
	print(result)
fnsum(1,2,3,4,5,6)
def fn2(a,*c,b):
	print('a=',a)
	print('b=',b)
	print('c=',c)
fn2(1,2,3,4,5,b=4)
# ** 指代未明确标出来的关键字参数,所有被指代的实参将组成一个字典,其中关键字为key,值为value,只能有一个,必须放在所有形参的最后
def fn3(c,**d):
	print('d',d,type(d))
	print('c=',c)
fn3(a=1,b=2,c=3)
#解包
# * 用于对序列进行解包,序列的个数需要和形参的个数一致
def fn4(a,b,c):
	print('a=',a)
	print('b=',b)
	print('c=',c)
t = [1,2,3]
fn4(*t)
# **用于对字典进行解包,字典的key值需要和形参相对应
def fn5(a,b,c):
	print('a=',a)
	print('b=',b)
	print('c=',c)
d = {'a':1,'b':2,'c':3}
fn5(**d)

#help用于查看函数用法
help(print)
#文档字符串用于对函数用法进行说明
def fn6(a:str,b:bool,c:int=5):
	'''
		函数作用
		参数解释:
			a:类型,作用
			b:类型,作用
			c:类型,作用
	'''
	return a,b,c
help(fn6)

#作用域
'''
分为两种:
	全局作用域:
		程序运行时创建,程序结束时销毁
		不在函数内部创建的对象
		任意地方都可以使用
	函数作用域:
		函数调用时创建,调用结束时销毁
		函数内部创建的对象
		仅在当前函数内部可以使用
'''
a = 10
def fn7():
	a = 20
	print('函数内部,a=',a)
fn7()
print('函数外部,a=',a)
#变量在查找值时,会优先在自己所在的作用域内去查找,未找到就去上一级作用域去查找,以此类推
def fn8():
	a = 20
	def fn9():
		print(a)
	fn9()
fn8()
#想要在函数内部去修改外部的变量,此时需要用到global,此时函数内部的变量指向的就是函数外部的变量
a = 10
def fn10():
	global a
	a = 20
	print('函数内部,a=',a)
fn10()
print('函数外部,a=',a)

#命名空间其实就是一个字典,用来存储变量,每一个变量在命名空间中都有一个指定的位置
#全局命名空间用来保存全局变量,函数命名空间用来保存函数内部的变量
#利用locals()方法可以查看当前作用域内的命名空间
#利用globals()方法可以在函数内部查看全局的命名空间
#d = locals()
#print(d)
def fn11():
	a = 20
	#print(locals())
	#print(globals())
fn11()

'''
递归式函数的两个要件
	1.基线条件:
		问题可以被分解为的最小问题,当条件满足了,递归就不在进行了
	2.递归条件:
		将问题继续分解的条件
'''
def dg(n):
	#基线条件
	if n==1:
		return 1
	return n * dg(n-1)
print(dg(10))
#判断字符串是否回文
def reverse(str):
	arr = list(str)
	n = len(arr)
	i = -1
	def isRever(n,i):
		i += 1
		if i == n / 2 or i == (n + 1) / 2:
			return True
		if  arr[i] != arr[n-i]:
			return False
		return 	isRever(n,i)
	return isRever(n,i)	
str = 'abcba'
#reverse(str)

#高阶函数:函数接收一个函数为参数,或者返回值为一个函数
def fnt(fnc,lst):
	new_list = []
	for i in lst:
		if fnc:
			new_list.append(i)
	return new_list
lst = [1,2,3,4,5,6,7,8,9]

#匿名函数,lambda为标记,函数只执行一次
(lambda i: i + 1)(1)#自调用,一般不这样用

#过滤器filter,可以从序列中过滤出符合条件的情况,返回成一个新的序列
r = filter(lambda i: i % 2 == 0,lst)
print(list(r))

#map()函数可以对迭代对象中的所有元素做指定的操作,然后返回成一个新的对象
r = map(lambda i: i + 5,lst)
print(list(r))

#sort()方法对序列进行排序,可传入一个key让序列按照指定函数的要求来排列,原来的序列发生改变
l = ['nnnn','aa','bbbbbbb','ddddddddddd']
l.sort()
print(l)
l.sort(key=len)
print(l)
#sorted()函数和sort()方法用法相似,但是不会改变原来的序列,会生成一个新的序列
l = [1,2,'3','1']
l1 = sorted(l,key=int)
print(l1)

'''
闭包的三个要素条件:
	1、函数套函数,
	2、内部函数作为返回值返回,
	3、内部函数需要用到外部函数的变量
作用:用于保存一些私有的数据,仅内部函数用到,其他地方无法操作
'''
def getAverager():
	nums = []
	def averager(n):
		nums.append(n)
		return sum(nums)/len(nums)
	return averager
r = getAverager()
print(r(10))
print(r(20))

#装饰器,在不改变原函数的情况下扩展函数功能
def begin_end(old):
	def newFn(*a,**b):
		print('开始执行')
		r = old(*a,**b)
		print('执行结束')
		return r
	return newFn

@begin_end
def add(a,b):
	print(a + b)
add(1,2)
    
    #日期和时间============================================
    import time
    #获取当前时间戳
    ticks = time.time()
    print("当前时间戳为:",ticks)
    #将获取到的时间戳转化为元组形式展示
    localtime = time.localtime(time.time())
    #获取格式化后的时间
    localtime1 = time.asctime(time.localtime(time.time()))
    print("本地时间为:",localtime)
    print("本地时间为:",localtime1)
    #格式化日期  time.strftime(format,t) format为日期格式
    #格式化成2018-12-20 11:45:39形式
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
    #格式化成Sat Dec 28 22:24:24 2018形式
    print(time.strftime("%a %b %d %H:%M:%S %Y",time.localtime()))
    #将格式字符串转换为时间戳
    t1 = "2018-12-20 11:45:39"
    t2 = "Sat Dec 28 22:24:24 2018"
    print(time.mktime(time.strptime(t1,"%Y-%m-%d %H:%M:%S")))
    print(time.mktime(time.strptime(t2,"%a %b %d %H:%M:%S %Y")))
    
    #获取某月日历==========================================
    import calendar
    cal = calendar.month(2018,12)
    print("以下输出2016年1月份")
    print(cal)
    #判断是否为闰年,是返True
    print(calendar.isleap(2018))
    
    #函数(def标记)==============================================
    def printme(str):#括号中的为参数
    	"打印传入的字符串到标准显示设备上" #函数说明
    	print(str) #具体执行
    	return #结束
    #调用函数
    printme("我是一个打印函数哦")
    
    #所有参数在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。
    def changeme(mylist):
    	"修改传入的列表"
    	mylist.append([1,2,3,4])
    	print("函数内取值:",mylist)
    	return
    
    mylist = [10,20,30]
    changeme(mylist)
    print("函数外取值:",mylist)
    
    #lambda匿名函数
    sum = lambda arg1, arg2: arg1 + arg2;
    print("Value of total:",sum(10,20))
    
    #模块======================================================
	'''
	引入模块的方法
	方法1:直接引入模块
		import 模块名
	方法2:给模块起别名
		import 模块名 as 别名
	方法3:仅引入需要的变量名
		from 模块名 import 变量1,变量2,变量3...
	方法4:给引入的变量名起别名
		from 模块名 import 变量 as 别名
	方法5:引入所有的变量
		from 模块名 import *
	'''
	
	import module1 as test
	#from module1 import *
	#每一个模块都有一个__name__属性,用于获取模块名。直接执行的模块为主模块,__name__属性值为__main__
	print(__name__)
	
	print(test.a)
	print(test.b)
	print(test._c)
	test.test()
	p = test.Person()
	print(p.name)
	
	'''
	print(a)
	print(b)
	#print(_c)#name '_c' is not defined
	test()
	p = Person()
	print(p.name)
	'''
	#对于模块特别复杂的,我们可以通过包的形式引入
	#包也是一个模块,普通模块是py文件,包是一个文件夹
	import package 
	from package import a , b
	print(package.m)
	print(package.n)
	print(a.name)
	print(b.name)
	
	#为了提高程序运行的性能,python会在编译过一次以后,在文件内生成一个__pycache__文件夹,里面为模块的缓存文件,下次再编译的时候直接调用
	
	引入内置模块:
	
	#python中有一个标准库,封装了一些常用的方法,我们可以直接去调用

	#pprint模块,用于美化打印的样式
	import pprint
	
	#sys模块。里面提供了一些变量和函数,让我们可以获取到python解析器的信息
	import sys
	
	#sys.argv
	#获取执行代码时,命令行中所包含的参数,以列表的形式展示
	print(sys.argv)
	
	#sys.modules
	#获取当前程序中引入放入所有模块,以字典的形式返回
	pprint.pprint(sys.modules)
	
	#sys.path
	#获取模块的搜索路径
	pprint.pprint(sys.path)
	
	#sys.platform
	#获取当前python运行的平台
	print(sys.platform)
	
	#sys.exit
	#推出程序
	#sys.exit('程序出现异常,退出')
	
	#os模块,让我们对操作系统进行访问
	import os
	
	#os.environ
	#获取到程序的环境变量
	pprint.pprint(os.environ)
	
	#os.system
	#用来执行操作系统的名字
	os.system('dir')
    
    #文件I/O===================================================
    #读取键盘输入
    str2 = input("请输入:");
    print("你输入的内容是:",str2);
    
    #读取文件
    import codecs
    fd = codecs.open('foo.txt') #打开文件 open函数
    '''
    a1 = fd.read() #读取文件
    print(dir(fd)) #查看fd可以进行哪些操作
    a2 = a1.replace('a','c') #替换文件中的某个元素
    print(a2)
    '''
    '''
    print(fd.readlines())#把文件每行内容作为一个字符串放在一个list中
    '''
    print(fd.readline())#读取一行文件
    
    fd.close() #关闭文件 close函数
    
    #写入文件
    '''
    fd = codecs.open('foo1.txt','w+')
    fd.write('aaa\nbbb\n')#写入一个字符串
    fd.close()
    '''
    
    fd = codecs.open('foo1.txt','w')
    fd.writelines(['123\n','234\n','345\n'])#写入一个列表
    fd.close()
    
    #打印文件行号和文件内容
    with codecs.open('foo.txt') as fd:
    	for line,value in enumerate(fd):
    		print(line,value)
    
    #获取文件固定行的内容
    import linecache
    print(linecache.getline('foo.txt',2))

	#文件地址
	#file_name = 'hello/hello.txt'
	#file_name = 'hello\hello.txt'
	#file_name = 'hello\\hello.txt'
	file_name = r'hello\hello.txt'
	
	#open打开文件
	#调用open来打开文件,可以将文件分为两种类型
	#t一种是纯文本文件,编码格式为utf-8
	#b一种是二进制文件,如图片、mp3、ppt等
	#open打开文件时,默认以文本文件的形式打开,默认的编码为None,所以打开指定编码的文件时,需要特别指定
	#使用open打开文件,需要指定所要做的操作,默认是只读'r'
	#'w'为写入,文件不存在创建文件,文件存在截断原文件,删除原文件的内容
	#'a'为追加,文件不存在创建文件,文件存在追加内容
	#'r+'读写操作,不会创建文件
	#file_txt = open(file_name)
	
	#read读取文件
	#读取到的文件默认会将文件中的所有内容返回,若文件过大则会造成内存溢出
	#read中有size属性,可以控制读取的数量,默认是-1
	#读取一行文件,readline
	#readlines一行一行读取文件,直到全部读取完成,以列表的形式返回
	#content = file_txt.read()
	#print(content)
	
	#close关闭文件
	#file_txt.close()
	
	#with...as语句,不用再手动关闭,语句会自动关闭文件
	with open(file_name) as file_txt:
		content = file_txt.read()
		print(content)
	
	#一行一行读取文件readlines
	with open(file_name) as file_txt:
		content = file_txt.readlines()
		for t in content:
			print(t,end='')
	
	#写入文件
	with open('hello1.txt','w',encoding='utf-8') as file_txt:
		file_txt.write('每个夜晚来临的时候\n')
		file_txt.write('孤独总在我左右\n')
	
	#追加文件
	with open('hello1.txt','a',encoding='utf-8') as file_txt:
		file_txt.write('每个黄昏心跳的等候\n')
		file_txt.write('是我无情的温柔\n')
	
	#异常处理
	file_name = 'hello.txt'
	try:
		with open(file_name,encoding='utf-8') as file_txt:
			content = file_txt.read()
			print(content)
	except FileNotFoundError:
		print(f"{file_name}文件不存在")
	
	#读取大文件,分批读取
	file_name = 'hello.txt'
	try:
		with open(file_name,encoding='utf-8') as file_txt:
			#每次读取字符数
			count = 6
			#存放读取内容
			content_txt = ''
			while True:
				content = file_txt.read(2)
				#读完跳出循环
				if not content:
					break
				content_txt += content
	except FileNotFoundError:
		print(f"{file_name}文件不存在")
	
	print(content_txt)
	
	#读取写入二进制文件
	file_name = 'C:/Users/Administrator/Desktop/aa.jpg'
	with open(file_name,'rb') as file_obj:
	
		with open('a.jpg','wb') as file_jpg:
			count = 1024 * 1000
			while True:
				content = file_obj.read(count)
				if not content:
					break
				file_jpg.write(content)
	
	#指定插入位置
	file_name = r'hello\hello.txt'
	#读取二进制文件,读取为本文件要注意每个汉字为3个字节
	with open(file_name,'rb') as file_obj:
		file_obj.read(10)
		#seek()指定当前读取的位置
		#有两个参数,第一个参数指代个数,第二个参数指起点(0:默认为0,从开始读取;1:从当前位置读取;2:从末尾读取)	
		file_obj.seek(20)#这儿指代的是字节
		file_obj.seek(20,1)
		#file_obj.seek(-1,2)
		print(file_obj.read(10))
		#tell()获取当前读取的个数
		print(file_obj.tell())
	
	#文件其他相关操作
	import os
	from pprint import pprint
	
	#获取指定目录的目录结构,以列表的形式返回
	r = os.listdir()
	#r = os.listdir('.')
	#r = os.listdir('..')
	pprint(r)
	
	#获取当前所在的目录
	r = os.getcwd()
	
	#切换当前所在的目录,相当于cd
	#os.chdir('../')
	r = os.getcwd()
	print(r)
	
	#创建目录
	#os.mkdir('aaa')
	
	#删除目录
	#os.rmdir('aaa')
	
	#删除文件
	#os.remove('hello1.txt')
	
	#重命名
	os.rename('hello.txt','aa.txt')        

    #异常处理=====================================================
    #通过try except来处理可能存在异常的情况
	try:#异常代码块
		print(10/0)
		print(a)
		1 + 'hello'
	except ZeroDivisionError:#针对每一种异常类单独做处理,出现异常时执行的代码块
		print('我是ZeroDivisionError异常')
	except NameError:
		print('我是NameError异常')
	except TypeError:
		print('我是TypeError异常')
	except Exception as e:#Exception是所有异常的父类,所有异常都会收集,e为异常的别名
		print('出错了呀',e,type(e))
	else:#没有出错时执行的代码块
		print('没有出错')
	finally:
		print('有没有异常都会执行')
	
	#try必须有,else可有可无,except和finally至少有一个
	
	#异常传播
	#由函数异常处向函数调用处传播,传播的是异常对象,所有的异常都会存储到一个异常对象中
	def fn1():
		print('我是fn1函数')
		try:
			print(10/0)
		except:
			print('出错了呀')
	def fn2():
		print('我是fn2函数')
		fn1()
	def fn3():
		print('我是fn3函数')
		fn2()
	fn3()
	
	#自主抛出异常
	#自定义异常类,必须要继承Exception
	class AddError(Exception):
		pass
	
	def add(a,b):
		if a < 0 or b < 0:
			#通过raise Exception来抛出异常
			#raise Exception('两个参数存在小于0的情况')
			#通姑自定义异常类抛出异常
			raise AddError('两个参数存在小于0的情况')
		else:
			r = a + b
			return r
	print(add(-1,2))
    
    #常见异常
    '''
    Exception 所有异常的基类 
    AttributeError 特征引用或者赋值失败时引发的 
    IOError 试图打开不存在的文件(包括其他情况) 
    IndexError 使用序列中不存在的索引 
    KeyError 使用映射中不存在的键 
    NameError 找不到名字(变量) 
    SyntaxError 在代码为错误形式时引发 
    SystemExit 系统异常退出 
    TypeError 在内建操作或者函数应用与错误类型的对象时 
    ValueError 正确的类型对象,但是对象使用不合适的值 
    ZeroDivisionError 除法,第二参数为0
    
    '''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值