Python第三天

函数和模块的使用

函数是组织好的,可重复使用,用来实现单一,或功能相关的代码段
优缺点
  • 代码重用
  • 保持可扩展性

定义一个函数

在这里插入图片描述

函数返回值的作用
  • 返回函数值
  • 结束函数执行
返回值的类型
  • 当没有返回值,返回NULL
  • 返回为特定值时,返回这个值
  • 当返回为函数名时,返回的是一个内存地址。
  • 当返回时一个函数时,返回的时函数的执行结果。
  • 可以返回多个不同类型的值,会将其封装为一个元组。

设置形参与实参

def test(a,b,c)

test(1,b=2,c=4)

  • 位置参数一定要放在关键字参数前
  • 形参和实参数量相同
  • 关键字参数和形参要同名。
  • 关键字调用与形参位置无关‘
  • 位置参数和关键字参数同时调用,以位置参数为主

实参的设置

  • *args可以接受剩余的所有形参未定义的实参(接受N个位置参数,并将其转换为元组的形势)
  • args会把接收的参数转化成元祖。
  • **kwargs会把参数组转化成一个字典

变量

全局变量
#Author:Anliu
school = "xiyunkeji" #全局变量
def change_name(name):
school = "baiyijishu" #在函数内是不能修改全局变量的值
print("before change",name,school)
name = "Auliu" #局部变量,这个函数就是变量的作用域
print("after change",name)
name = "anliu"
change_name(name)
print(name,school)

定义global之后,全局变量也是可以在函数内修改的。

#Author:Anliu
school = "xiyunkeji" #全局变量
def change_name(name):
global school #定义global之后,全局变量也是可以在函数内修改的。
school = "baiyijishu" #在函数内是不能修改全局变量的值
print("before change",name,school)
name = "Auliu" #局部变量,这个函数就是变量的作用域
print("after change",name)
name = "anliu"
change_name(name)
print(name,school)
局部变量
局部变量,这个函数就是变量的作用域
#Author:Anliu
def change_name(name):
print("before change",name)
name = "Auliu" #局部变量,这个函数就是变量的作用域
print("after change",name)
name = "anliu"
change_name(name)
print(name)

注意:

需要说明的是,当全局变量为列表,字典,集合包括类,这种复杂的数据类型及数据结果,函数中也是可以修改全局变量的

递归

在函数内部,可以调运其他函数。如果一个函数在内部调运自身,这个函数就是递归函数
递归的特性:
  • 必须要有一个明确的结束条件。
  • 每次进入更深的一层递归时,问题规模相比上次都应有所减少
  • 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调运是通过栈(stack)这种数据结构
    实现的,每当进入一个函数调运,栈就会加一层栈帧。每当函数返回,栈就会减少一层栈帧。由于栈的
    大小不是无限的,所以,递归调运的次数过多,会导致栈溢出)
#Author:Anliu
 def calc(n):
print(n)
if int(n/2) > 0:
return calc(int(n/2))
print("-->",n)
calc(10)

高阶函数

  • 把一个函数名当做实参传递给另一个函数

  • 返回值中包含函数名

#Author:Anliu
def test1(func):
print(func)
def bar():
print("in the bar")
test1(bar)
func = bar
func()
运行结果
<function bar at 0x000001987C1574C8>
in the bar

嵌套函数

在一个函数体内定义另一个函数

#Author:Anliu
def foo():
print("in the foo ")
def bar():
print("in the bar")
bar()
foo()

函数式编程介绍:

装饰器:

装饰器:装饰器本质是函数,(函数是有特定的功能),装饰器的功能就是装饰他功能。就是为其他函数添加附加功能。

原则:
  • 不能修改被装饰函数的源代码
  • .不能修改被装饰的函数的调运方式(装饰器对被装饰函数来说是透明的)
  • 装饰器=高阶函数+嵌套函数
#Author:Anliu
import time
def test1():
    '''xxxxx'''
	print("this is a test1")
def timer (func):
	def logger():
		'''xxxxx'''
		func()
		format_time = "%Y-%m-%d %X"
		time_current = time.strftime(format_time)
		print(time_current)
	return logger
test1 = timer(test1)
test1()
输出结果:
this is a test1
2019-07-13 00:49:58


这个我们实现了一个装饰器功能。再看这两行代码:

test1 = timer(test1)
test1()

很麻烦,python解释题给我们提供了一个“语法糖”,我们可以使用“语法糖”来实现。

可以用@timer代替这两行代码!!!

文件操作的流程

  • 打开文件,得到文件句柄并赋值给变量。
  • 通过句柄对文件进行操作。
  • 通过句柄对文件进行操作。
  • 关闭文件。

从文件中读取数据

#Author:Anliu 
with open("..\DIR_file\pi_digits",encoding=("utf-8")) as file_object:    
	lines = file_object.readlines()   
 	print(lines) 
 for line in lines:    
	 print(line.rstrip())

读取文件的操作

遍历全文

f = open(“shige”,“r”,encoding=“utf-8”)
for line in f.readlines():
print(line.strip())
f.close()

读文件的前五行

f = open(“shige”,“r”,encoding=“utf-8”)
for i in range(5):
print(f.readline())
f.close()

第十行不打印

f = open(“shige”,“r”,encoding=“utf-8”) for index,line in enumerate(f.readlines()): if index == 9:
print("----------------分割线——————————————")
continue
print(line.strip())

文件读取

文件读取的原理,文件读取本质上是文件指针的移动:

f = open("shige","r",encoding="utf-8")
 print(f.tell())
 #print(f.read(5))  #读了多上个字符 
 #print(f.tell())   #记录指针位置
 print(f.readline()) 
 print(f.readline()) 
 print(f.readline()) 
 f.seek(0)
 print(f.readline())

写入空文件

有四种方式:
  • w:以写入方式打开文件
  • r+:读取和写入
  • w+:先创建新文件,在写入
  • a+:追加读写
  • wb:写入二进制文件

文件的强制持久化

在我们安装软件的时候,出现的进度条,实际上就是这种持续刷新的过程。
#!/bin/python 
import sys,time 
for i in range(20):  
  sys.stdout.write("#")  
    sys.stdout.flush()   
     time.sleep(0.1) 

文件截断

f = open("shige","a",encoding="utf-8")
 f.truncate(20)

修改文件

  • 将文件加载到内存中,在内存中修改
  • 打开一个新文件,在新文件中修改
#Author:Anliu 
f = open("write_file","r",encoding="utf-8") 
f_new = open("write_file.bak","w",encoding="utf-8")
for line in f:   
	if "徐志摩" in line:     
    	line = line.replace("徐志摩","anliu")  
    f_new.write(line)
 
f.close()
 f_new.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值