Python第十七节课
本节内容
函数
函数的定义
# 函数往往是表示一组重复的数据和代码块 # 函数使用关键字def来表示定义函数 # 函数的名字一般是有特殊的含义,我们往往使用驼峰命名法来命名。
函数的调用
# 函数的声明结束之后,函数并不会被调用 # 我们需要直接写明函数的调用
返回值
# 函数中,我们可以使用return来表示函数的返回值 # 也就是说,我们将函数调用之后,会有个返回值 # 返回值往往表示函数的结束,当函数遇到return之后,这个函数就停止。
函数的参数
必备参数
# 形参和实参的个数必须是一致的,否则就会报错
缺省参数
# 我们可以定义参数,这样当某个参数没有传入的时候 # 可以直接使用缺省参数
关键字参数
# 我们可以在调用的时候,使用关键字参数,这样参数将不会受到位置的限制
可变参数
# 可以使用*arge来表示可变的参数,这样形参和实参的个数可以不一致。
例子:
def func(a, b): return a + b func(1, 2) ---> 必备参数的形参和实参一一对应 def func(a='1', b='2'): return a + b func() ---> 缺省参数的实参可以不设定,但是一旦设定,位置也是一一对应的 def func(a, b): return a + b func(b=1, a=2) ---> 关键字参数,实参可以根据名字传递给形参 def func(a, *arges): print(a) ---> 1 print(*arges) ---> 2, 3, 4 func(1, 2, 3, 4) ---> 不限长参数,这个时候表示至少有一个参数,其余参数不被限制
变量
作用域
# 局部作用域中的变量我们称之为叫局部变量 # 全局作用域中的变量我们称之为叫全局变量 # 局部变量只能在局部作用域中使用,外部函数不能使用 # 全局变量可以被任何一个函数使用,对于所有的函数都起作用。
作用域链
扫描二维码关注公众号,回复: 9858222 查看本文章# 作用域链是指,我们会有限的使用局部变量,如果局部变量不存在,那么就会使用全局变量。
闭包
# 如果希望其中的某一个变量不被回收,能够一直存在在程序中。 # 我们可以使用闭包来实现,即在外层函数中声明并返回里层函数。 # 里层函数中可以声明一个局部变量,这样局部变量并不会被回收掉。 # 因为当我们调用外层函数的时候,里层函数就会被调用 # 但是外层函数被回收的时候,里层函数还没有执行结果 # 所以程序是不会强制回收的。
关键字声明变量
global # 可以将局部变量变成全局变量 nonlocal # 将变量变成非局部变量 匿名函数
匿名函数
# lambda 表示声明一个没有名字的函数 # 这个函数是单行的,只能放置很少的代码 # 语法结构:lambda x,y : x+y # 其中冒号前面表示参数,冒号后边表示返回值
递归函数
# 我们可以在函数中自己调用自己 # 但是递归函数最多的调用次数就是998次,多出的就不会再遍历。
test:
请使用函数将昨天的作业进行一下的修改
在时间为偶数的日志文件中,任意添加一段文字。
# 根据昨天的作业 import datetime import os def file_tree(path): a = ['物联网', 'AI', 'matplotlib', 'anaconde', 'NLP', 'lua'] for i in a: os.chdir(path) os.mkdir(i) os.chdir(path + f"//{i}") def test(z): if z % 2 == 0 and z <= 10: now = datetime.datetime.now().date() result = now - datetime.timedelta(days=z) open(f'{result.strftime("%Y-%m-%d")}.txt', 'w+') with open(f'{result.strftime("%Y-%m-%d")}.txt', 'w+') as f: f.write('偶数哦~') return test(z+1) elif z % 2 != 0 and z <= 10: now = datetime.datetime.now().date() result = now - datetime.timedelta(days=z) open(f'{result.strftime("%Y-%m-%d")}.txt', 'w+') return test(z+1) test(z=0) file_tree('E://sample')
注:简单来说,我们取消了while循环,采用递归为神的思维。要清楚,return返回的是test这个函数自己,也就是说test函数内部如果没有符合条件的z,就会触发return返回。也就变相终止了原地打圈圈。(如果还有什么地方不清楚,请留言~)
面向对象编程思维
类的定义
# 使用class关键字来定义一个类
类的属性
# 声明一个类之后我们可以设置一个默认属性 # 也可以不设置默认属性
类的属性增加和删除
# 类的属性是可以在实例化之后动态增加的 # 同时也可以删除 # 例如: class Person(object): ---> object 表示继承的父类 country = 'china' ---> 默认的属性 a = Person() ---> 对Person进行实例化 country = 'china' ---> 默认的属性(不用在意) a.country ---> 访问属性 a.name = '喜洋洋' ---> 增加属性 del a.country ---> 删除属性
test:
设定Person这个类
每一个人的默认属性都是中国人
但是每一个人的名字和年龄都是 不一样的
尝试写出这个类,并创建几个新的人。写法看自己的水平,可以写的很简单。作业:将昨天作业进行改变,删除日期为奇数的文件。(使用函数式)
import os def delsmfiles(path): os.chdir(path) oldpath = path for i in os.listdir(path): if os.path.isfile(i): num = i.split(".")[0].split("-")[-1] if int(num) % 2 == 0: print("{}是偶数日期的文件,已被删除".format(i)) os.remove(i) else: new_path = os.path.join(oldpath, i) delsmfiles(new_path) delsmfiles(r"E://sample") # 第二个split(“-”)会出现黄色,这个没有关系。