python基础学习总结(七)

一. 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如**print()**。但你也可以自己创建函数,这被叫做用户自定义函数。

1. 定义函数

你可以自定义一个自己想要功能的函数,以下是简单的规则:

  1. 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 () 。
  2. 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  3. 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  4. 函数内容以冒号起始,并且缩进。
  5. return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

2. 语法及实例

1
2
3
4
def func(str):
"打印任何传入的字符串"
print(str)
return

3. 函数调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

如下实例调用了**func()**函数

1
2
3
4
5
6
7
8
def func(str):
print(str)
return

# 调用函数
func("潘家辉")
func("是大佬!")

4. 参数传递

在 python 中,类型属于对象,变量是没有类型的:

1
2
a=[1,2,3] 
a="潘家辉大佬!"

以上代码中, [1,2,3] 是 List 类型, “潘家辉大佬!” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象。

5. 可更改与不可更改对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  1. 不可变类型: 变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
  2. 可变类型: 变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

  1. 不可变类型: 类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身;
  2. 可变类型: 类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响。

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

1
2
3
4
5
6
7
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 指向它。
如果改成

1
2
3
4
5
6
7
8
def func(a):
a = 10
return a

b = 2
func(b)
print(b)
print(func(b))

把a的形参赋值为b,之后返回a

6. 传可变对象实例

1
2
3
4
5
6
7
8
9
10
# 可写函数说明
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对象,相关的方法才可以调用它进行读写。

1
file object = open(file_name [, access_mode][, buffering])

各个参数的细节如下:

参数描述
file_namefile_name变量是一个包含了你要访问的文件名称的字符串值。
access_modeaccess_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’)。

1
2
3
4
5
fo = open("password.txt", "w")
# 写入
fo.write( "hello!\nworld!\n")
# 关闭打开的文件
fo.close()

注意: 会清空文件以前的内容重写

5. read()方法

read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

1
2
3
4
5
6
fo = open("password.txt", "r+")
# 读取
str = fo.read(10)
print("读取的字符串是 : ", str)
# 关闭打开的文件
fo.close()

6. 文件定位

tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。

seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。

如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 打开一个文件
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()