1. 函数关键字
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
2. 函数的定义
定义函数遵循以下简单规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def greet_user(): #不带参数
#显示简单的问候语句
print("Hello!")
def printstr(str): #带参数
#打印输入的字符串
print(str)
return
#调用函数
printstr("hello, python")
3. 函数参数与作用域
3.1 函数参数
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。
3.1.1 实参和形参
在前面的函数printstr()的定义中,变量str是一个形参——函数完成其工作所需的一项信息。值“hello,python"是一个实参,实参是调用函数时传递给函数的信息。
3.1.2 传递实参
鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参、关键字实参、默认实参等。
- 位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参,最简单的关联方式是基于实参的顺序,这种关联方式被称为位置实参。
-可以多次调用函数
-注意位置实参中的顺序
def pet(pet_type,pet_name):
#显示宠物信息
print("\nI have a " + pet_type + ".")
print("My " + pet_type + "'s name is " + pet_name.title() + ".")
pet("dog","Laien") #调用多次
pet("cat","mimi")
pet("hen","hamster") #实参的顺序不正确
#输出结果
I have a dog.
My dog's name is Laien.
I have a cat.
My cat's name is Mimi.
I have a hen.
My hen's name is Hamster. #实参顺序不正确,得不到想要的结果
- 关键字实参
关键字实参是传递给函数的名称-值对,直接在实参中将名称和值关联起来了,一次向函数传递实参时不会混淆。关键字实参无需考虑函数调用中的实参顺序,还清楚指出了函数调用中各个值的用途。
def pet(pet_type,pet_name):
#显示宠物信息
print("\nI have a " + pet_type + ".")
print("My " + pet_type + "'s name is " + pet_name.title() + ".")
#关键字实参
pet(pet_name = "hen",pet_type = "hamster")
#输出结果
I have a hamster.
My hamster's name is Hen.
- 默认参数
编写函数时,可以给每个形参制定默认值。在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还清楚的指出函数的典型用法。值得注意的是,使用默认参数时i,在形参列表中必须先列出没有默认值的形参,在列出有默认值的形参。
def pet(pet_name,pet_type = "dog"): # pet_type默认为dog
#显示宠物信息
print("\nI have a " + pet_type + ".")
print("My " + pet_type + "'s name is " + pet_name.title() + ".")
pet(pet_name = "Lee")
#输出结果
I have a dog.
My dog's name is Lee.
- 组合参数
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
f1(1, 2)
#输出结果
a = 1 b = 2 c = 0 args = () kw = {}
3.2 函数作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
- 全局变量
- 局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用。
def sum(arg1,arg2):
#返回两个参数的和
total = arg1 + agr2 #total在这里是局部变量
print("函数内是局部变量: ",total)
return total
#调用sum函数
sum(30,10)
print("函数外是全局变量: ",total)
#输出结果
函数内是局部变量 : 30
函数外是全局变量 : 0
4. 函数返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。
- 返回简单值
def name(first_name,last_name):
#返回规范姓名
full_name = first_name + " " + last_name
return full_name.title()
player = name("jimi","lee")
print(player)
#输出结果
Jimi Lee
- 可选实参
def name(first_name,middle_name,last_name):
#返回规范姓名
if middle_name:
full_name = first_name + " " + middle_name + " " + last_name
else:
full_name = first_name + " " + last_name
return full_name.title()
- 返回字典
def build_person(first_name,last_name):
#返回一个字典,其中包含一个人的信息
person = {"first": first_name,"last": last_name}
return person
player = build_person("jimi","lee")
print(player)
#输出
{'last': 'lee', 'first': 'jimi'}
5. file
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。可以用 file 对象做大部分的文件操作。
5.1 打开方式
- open函数
必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
open函数语法:
file object = open(file_name [, access_mode][, buffering])
参数说明:
file_name:file_name变量是一个包含了要访问的文件名称的字符串值。
access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®。
buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
t | 文本模式 (默认) |
x | 写模式,新建一个文件,如果该文件已存在则会报错 |
b | 二进制模式 |
U | 通用换行模式(不推荐) |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写 |
读取文件
import os
os.chdir("D:/ProgramFiles/Jupyter")
f = open('readandwrite.txt')
print(f)
a = f.read() #读
print(a)
a = open('readandwrite.txt', 'w') #写
a.write('我写的东西即将覆盖所有!')
5.2 文件对象的操作方法
- close()方法
File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
fileObject.close()
- write()方法
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
write()方法不会在字符串的结尾添加换行符(’\n’):
fileObject.write(string)
- read()方法
read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
fileObject.read([count])
-
文件定位
tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。 -
重命名和删除文件
Python的os模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。
要使用这个模块,你必须先导入它,然后才可以调用相关的各种功能。
rename()方法:
rename()方法需要两个参数,当前的文件名和新文件名。
os.rename(current_file_name, new_file_name)
remove()方法:
可以用remove()方法删除文件,需要提供要删除的文件名作为参数
os.remove(file_name)
5.3 对excel及csv文件操作
import pandas as pd
## 创建DataFrame ##
df = pd.DataFrame({'col1':[1,2,3,4], 'col2':[4,5,6,7], 'col3':[7,8,9,10]})
import os
path = os.path.dirname(os.path.abspath('__file__')) # 查看当前文件的路径
# path = os.getcwd() # 查看路径的另一种方式
print(path)
df.to_excel('dataframe.xlsx')
os.chdir("C:/Users/lingling/Desktop")
df.to_excel('dataframe.xlsx')
os.chdir("D:/ProgramFiles/Jupyter/GirlsInAI")
df.to_excel('dataframe.xlsx')
df2 = pd.read_excel('dataframe.xlsx') # 读取excel文件
df2.to_csv('df2.csv')
df3 = pd.read_csv('df2.csv') #读取csvw文件
6. OS模块
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
序号 | 方法及描述 |
---|---|
1 | os.access(path, mode),检验权限模式 |
2 | os.chdir(path),改变当前工作目录 |
3 | os.chflags(path, flags),设置路径的标记为数字标记 |
4 | os.chmod(path, mode),更改权限 |
5 | os.chown(path, uid, gid),更改文件所有者 |
6 | os.chroot(path),改变当前进程的根目录 |
7 | os.close(fd),关闭文件描述符 fd |
8 | os.closerange(fd_low, fd_high),关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
9 | os.dup(fd),复制文件描述符 fd |
10 | os.dup2(fd, fd2),将一个文件描述符 fd 复制到另一个 fd2 |
11 | os.fchdir(fd),通过文件描述符改变当前工作目录 |
12 | os.fchmod(fd, mode),改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限 |
13 | os.fchown(fd, uid, gid),修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定 |
14 | os.fdatasync(fd),强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息 |
15 | os.fdopen(fd[, mode[, bufsize]]),通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
16 | os.fpathconf(fd, name),返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它) |
17 | os.fstat(fd),返回文件描述符fd的状态,像stat() |
18 | os.fstatvfs(fd),返回包含文件描述符fd的文件的文件系统的信息,像 statvfs() |
19 | os.fsync(fd),强制将文件描述符为fd的文件写入硬盘 |
20 | os.ftruncate(fd, length),裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
21 | os.getcwd(),返回当前工作目录 |
22 | os.getcwdu(),返回一个当前工作目录的Unicode对象 |
23 | os.isatty(fd),如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
24 | os.lchflags(path, flags),设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
25 | os.lchmod(path, mode),修改连接文件权限 |
26 | os.lchown(path, uid, gid),更改文件所有者,类似 chown,但是不追踪链接。 |
27 | os.link(src, dst),创建硬链接,名为参数 dst,指向参数 src |
28 | os.listdir(path),返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
29 | os.lseek(fd, pos, how),设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
30 | os.lstat(path),像stat(),但是没有软链接 |
31 | os.major(device),从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
32 | os.makedev(major, minor),以major和minor设备号组成一个原始设备号 |
33 | os.makedirs(path[, mode]),递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
34 | os.minor(device),从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field ) |
35 | os.mkdir(path[, mode]),以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制) |
36 | os.mkfifo(path[, mode]),创建命名管道,mode 为数字,默认为 0666 (八进制) |
37 | os.mknod(filename[, mode=0600, device]),创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe) |
38 | os.open(file, flags[, mode]),打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
39 | os.openpty(),打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
40 | os.pathconf(path, name),返回相关文件的系统配置信息。 |
41 | os.pipe(),创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
42 | os.popen(command[, mode[, bufsize]]),从一个 command 打开一个管道 |
43 | os.read(fd, n),从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
44 | os.readlink(path),返回软链接所指向的文件 |
45 | os.remove(path),删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory |
46 | os.removedirs(path)递归删除目录 |
47 | os.rename(src, dst),重命名文件或目录,从 src 到 dst |
48 | os.renames(old, new),递归地对目录进行更名,也可以对文件进行更名。 |
49 | os.rmdir(path),删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
50 | os.stat(path),获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
51 | os.stat_float_times([newvalue]),决定stat_result是否以float对象显示时间戳 |
52 | os.statvfs(path),获取指定路径的文件系统统计信息 |
53 | os.symlink(src, dst),创建一个软链接 |
54 | os.tcgetpgrp(fd),返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
55 | os.tcsetpgrp(fd, pg),设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
56 | os.tempnam([dir[, prefix]]),返回唯一的路径名用于创建临时文件。 |
57 | os.tmpfile(),返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
58 | os.tmpnam(),为创建一个临时文件返回一个唯一的路径 |
59 | os.ttyname(fd),返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
60 | os.unlink(path),删除文件路径 |
61 | os.utime(path, times),返回指定的path文件的访问和修改的时间。 |
62 | os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]),输出在文件夹中的文件名通过在树中游走,向上或者向下 |
63 | os.write(fd, str),写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
64 | os.path 模块,获取文件的属性信息 |