Python基础 -- 函数局部变量和全局变量文件(包含序列化和反序列化)异常

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础 -- 函数局部变量和全局变量文件(包含序列化和反序列化)异常相关的知识,希望对你有一定的参考价值。

1. 函数


1.1 定义函数

思考:下列代码的问题

print('Hello ')
print('       World')

print('Hello ')
print('       World')

print('Hello ')
print('       World')

print('Hello ')
print('       World')

代码冗余。定义函数就可以很好的解决代码冗余的问题

定义函数的格式如下:

def 函数名(): 
	代码

示例:

# 定义一个函数,能够完成打印信息的功能
def printHW():
    print('Hello ')
    print('       World')

1.2 调用函数

定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它 调用函数很简单的,通过 函数名() 即可完成调用。

# 定义一个函数,能够完成打印信息的功能
def f1():
    print('Hello ')
    print('       World')


# 定义完函数后,函数是不会自动执行的,需要调用它才可以
f1()

运行结果:

函数定义好以后,函数体里的代码并不会执行,如果想要执行函数体里的内容,需要手动的调用函数。 每次调用函数时,函数都会从头开始执行,当这个函数中的代码执行完毕后,意味着调用结束了。


1.3 函数参数

思考一个问题,如下:

现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代 码可以吗?有什么缺陷吗?

def add2num():
    a = 11
    b = 22
    c = a + b
    print(c)

为了让一个函数更通用,即想让它计算哪两个数的和,就让它计算哪两个数的和,在定义函数的时候可以让函数接 收数据,就解决了这个问题,这就是 函数的参数

定义、调用带有参数的函数:

def add2num(num1, num2):
    print(num1 + num2)


add2num(11, 22)  # 位置传参 调用带有参数的函数时,需要在小括号中,传递数据
add2num(num2=22, num1=11)  # 可以使用关键字传参

运行结果:

注意:

  • 在定义函数的时候,小括号里写等待赋值的变量名
  • 在调用函数的时候,小括号里写真正要进行运算的数据
  • 定义时小括号中的参数,用来接收参数用的,称为 “形参”
  • 调用时小括号中的参数,用来传递给函数用的,称为 “实参”

1.4 函数返回值

带有返回值的函数:

想要在函数中把结果返回给调用者,需要在函数中使用return关键字

如下示例:

def add2num(num1, num2):
    return num1 + num2

保存函数的返回值:

使用变量去接函数的返回值即可

def add2num(num1, num2):
    return num1 + num2


sum = add2num(1, 2)
print('sum is ', sum)

运行结果:


2. 局部变量和全局变量


2.1 局部变量

局部变量是指在函数内部定义并使用的变量,它只在函数内部有效。
作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。

示例: 局部变量的使用

def test1():
    num = 100
    print("test1中的num值为:%d" % num)


def test2():
    num = 200
    print("test2中的num值为:%d" % num)


# 函数调用
test1()
test2()

运行结果:


2.2 全局变量

全局变量可以在整个程序范围内访问。有以下两种情况:

2.2.1 在函数外定义变量

如果一个变量在函数外定义,那么不仅可在函数外可以访问,
在函数内也可以访问到

示例:

result = 100  # 全局变量


def sum(a, b):
    result = a + b  # 局部变量
    print("函数内的result的值为:", result)  # result在这里是局部变量
    return result


# 调用sum函数
sum(100, 200)
print("函数外的变量result是全局变量,等于", result)

运行结果:


2.2.2 在函数体内定义变量

在函数体内定义,并且使用global关键字修饰后,
该变量也就变为全局变量。在函数体内还可以对其进行修改
a = 100


def test():
    global a
    a += 100
    print(a)


test()


3. 文件


3.1 文件的打开与关闭

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件

open(文件路径,访问模式)

示例:f = open('test.txt', 'w')

文件路径:

访问模式:

关闭文件:

示例如下:

# 新建一个文件,文件名为:test.txt 
f = open('test.txt', 'w') 

# 关闭这个文件 
f.close()

3.2 文件的读写

写数据(write)

使用write()可以完成向文件写入数据

f = open('test.txt', 'w')
f.write('hello world, i am here!\\n' * 5)
f.close()

运行之后会在当前文件所在的路径中创建一个文件 test.txt,并写入内容,运行效果显示如下:

注意:

  • 如果文件不存在,那么创建;如果存在那么就先清空,然后写入数据

读数据(read)

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入 num,那么就表示读取文件中所有的数据

f = open('test.txt', 'r')
content = f.read(5)  # 最多读取5个数据
print(content)

print("‐" * 30)  # 分割线,用来测试

content = f.read()  # 从上次读取的位置继续读取剩下的所有的数据

print(content)

f.close()  # 关闭文件,这个可是个好习惯哦

运行结果:

读数据(readline)

readline只用来读取一行数据。

f = open('test.txt', 'r')
content = f.readline()
print("1:%s" % content)
content = f.readline()
print("2:%s" % content)
f.close()

运行结果:

读数据(readlines)

readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行为列表的 一个元素。

f = open('test.txt', 'r')
content = f.readlines()
print(type(content))

for temp in content:
    print(temp.rstrip())

f.close()

运行结果:


3.3 序列化和反序列化

通过文件操作,我们可以将字符串写入到一个本地文件。但是,如果是一个对象(例如列表、字典、元组等),就无 法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里。

设计一套协议,按照某种规则,把内存中的数据转换为字节序列,保存到文件,这就是序列化,反之,从文件的字 节序列恢复到内存中,就是反序列化。

Python中提供了JSON这个模块用来实现数据的序列化和反序列化。

JSON模块

JSON(javascriptObjectNotation, JS对象简谱)是一种轻量级的数据交换标准。JSON的本质是字符串

使用JSON实现序列化

JSON提供了dump和dumps方法,将一个对象进行序列化。 dumps方法的作用是把对象转换成为字符串,它本身不具备将数据写入到文件的功能。

import json

file = open('names.txt', 'w')
names = ['zhangsan', 'lisi', 'wangwu', 'jerry', 'henry', 'merry', 'chris']

# file.write(names) 出错,不能直接将列表写入到文件里

# 可以调用 json的dumps方法,传入一个对象参数
result = json.dumps(names)

# dumps 方法得到的结果是一个字符串
print('result type is ', type(result))  # <class 'str'>

# 可以将字符串写入到文件里
file.write(result)
file.close()

运行结果:

dump方法可以在将对象转换成为字符串的同时,指定一个文件对象,把转换后的字符串写入到这个文件里。

import json

file = open('names.txt', 'w')
names = ['Jack', 'Rose', 'James', 'Harry', 'Tom', 'Trump', 'Jany']

# dump方法可以接收一个文件参数,在将对象转换成为字符串的同时写入到文件里
json.dump(names, file)
file.close()

运行结果:

使用JSON实现反序列化:

使用loads和load方法,可以将一个JSON字符串反序列化成为一个Python对象。

loads方法需要一个字符串参数,用来将一个字符串加载成为Python对象。

import json

# 调用loads方法,传入一个字符串,可以将这个字符串加载成为Python对象
result = json.loads('["zhangsan", "lisi", "wangwu", "jerry", "henry", "merry", "chris"]')
print(type(result))

运行结果:

load方法可以传入一个文件对象,用来将一个文件对象里的数据加载成为Python对象。

import json

# 以可读方式打开一个文件
file = open('names.txt', 'r')

# 调用load方法,将文件里的内容加载成为一个Python对象
result = json.load(file)

print(result)
file.close()

运行结果:


4. 异常

程序在运行过程中,由于我们的编码不规范,或者其他原因一些客观原因,导致我们的程序无法继续运行,此时, 程序就会出现异常。如果我们不对异常进行处理,程序可能会由于异常直接中断掉。为了保证程序的健壮性,我们 在程序设计里提出了异常处理这个概念。


4.1 读取文件异常

在读取一个文件时,如果这个文件不存在,则会报出 FileNotFoundError错误。


4.2 try…except语句

try…except语句可以对代码运行过程中可能出现的异常进行处理。 语法结构:

示例:

try:
    f = open('test.txt', 'r')
    print(f.read())
except FileNotFoundError:
    print('文件没有找到,请检查文件名称是否正确')

运行结果:



以上是关于Python基础 -- 函数局部变量和全局变量文件(包含序列化和反序列化)异常的主要内容,如果未能解决你的问题,请参考以下文章

python基础局部变量全局变量

python基础 函数局部变量 全局变量 递归

Python基础笔记系列九:变量自定义函数以及局部变量和全局变量

象皮筋Python 基础知识函数与函数式编程

python 3 基础之局部变量与全局变量

Python学习——02-Python基础——4-变量与递归函数