文章目录
一. 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
1. 定义函数
你可以自定义一个自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 () 。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
2. 语法及实例
def func(str):
"打印任何传入的字符串"
print(str)
return
3. 函数调用
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。
如下实例调用了**func()**函数
def func(str):
print(str)
return
# 调用函数
func("潘家辉")
func("是大佬!")
4. 参数传递
在 python 中,类型属于对象,变量是没有类型的:
a=[1,2,3]
a="潘家辉大佬!"
以上代码中, [1,2,3] 是 List 类型, “潘家辉大佬!” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象。
5. 可更改与不可更改对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
- 不可变类型: 变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
- 可变类型: 变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
- 不可变类型: 类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身;
- 可变类型: 类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响。
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
def func(a):
a = 10
return a
b = 2
func(b)
print(b)
实例中有 int 对象 2,指向它的变量是 b,在传递给 func函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。
如果改成
def func(a):
a = 10
return a
b = 2
func(b)
print(b)
print(func(b))
把a的形参赋值为b,之后返回a
6. 传可变对象实例
# 可写函数说明
def fun(list):
list.append(["大", "佬"])
print("函数内取值: ", list)
return
# 调用func函数
list = ["潘","家","辉"]
fun(list)
print("函数外取值: ", list)
将 list 真正的传过去,修改后fun外部的list也会受影响。
二. 文件I/O
1. 定义
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作,即打开和关闭文件。
2. File对象的属性
一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。
file对象相关的所有属性的列表:
属性 | 描述 |
---|---|
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
file.close() | 关闭文件 |
file.flush() | 清除输出缓冲区 |
file.next() | 返回下一行或引发stopTteration,在Python3中,对应方法为f.next() |
file.seek(offset[whence]) | 查找新文件位置,whence:起点,0: 从文件头,1:从当前位置,2:从文件尾部 offset:偏移量 |
file.writelines(line) | 写入序列line中的所有字符串 |
file.read(n) | 最多读取n个字节 |
file.softspace | 布尔值,指示在使用print语句时,是否应该在一个值之前打印空格字符。 |
file.xreadlines | 读取文件,向下兼容 |
file.encoding | 文件编码。如果没有使用任何编码该值为none |
file.readinto() | |
file.tell() | 返回当前文件指针 |
file.errors | |
file.readline([n]) | 读取单行输入的最多n个字符,如果省略n,则读取整行 |
file.truncate([n]) | 将文件截断为最多n个字符 |
file.fileno() | 返回一个整数文件描述符,从3开始 |
file.newlines | 在通用换行符模式下打开一个文件,该属性包含可在文件中实际找到的换行符吧表示。 如果没有找到换行符,该值为none,将会看到一个包含’\n’,‘\r’或’\r\n’的字符串,或者一个包含所有不同换行符的元组 |
file.readlines([size]) | 读取所有行并返回一个列表,size用于指定在读取操作停止前在文件上读取的近似字符数 |
file.write(s) | 写入字符串 |
file.isatty() | 是否是终端设备文件 |
3. open 函数
必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
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 | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
4. write()方法
读写文件:
file对象提供了一系列方法,能让我们的文件访问更轻松。来看看如何使用read()和write()方法来读取和写入文件。
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
write()方法不会在字符串的结尾添加换行符(‘\n’)。
fo = open("password.txt", "w")
# 写入
fo.write( "hello!\nworld!\n")
# 关闭打开的文件
fo.close()
注意: 会清空文件以前的内容重写
5. read()方法
read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
fo = open("password.txt", "r+")
# 读取
str = fo.read(10)
print("读取的字符串是 : ", str)
# 关闭打开的文件
fo.close()
6. 文件定位
tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
# 打开一个文件
fo = open("password.txt", "r+")
str = fo.read(10)
print("读取的字符串是 : ", str)
# 查找当前位置
position = fo.tell()
print("当前文件位置 : ", position)
# 把指针再次重新定位到文件开头
position = fo.seek(0, 0)
str = fo.read(10)
print("重新读取字符串 : ", str)
# 关闭打开的文件
fo.close()