return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
在 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 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
通过 id() 函数来查看内存地址变化:
可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
加了两个星号 ** 的参数会以字典的形式导入。
声明函数时,参数中星号 * 可以单独出现,如果单独出现星号 * 后的参数必须用关键字传入。
Python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
open() 将会返回一个 file 对象,基本语法格式如下:
open(filename, mode)
写文件:
在对应目录生成了“Python_test.txt” 文件,打开文件可以看到写入了内容:
接下来读取文件:
成功读取了刚刚写入的内容。
f.readline() 会从文件中读取单独的一行。换行符为 '\n'。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
f.readlines() 将返回该文件中包含的所有行。如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
如果要写入一些不是字符串的东西, 那么将需要先进行转换:
查看文件:
写入成功,并覆盖了原来的内容。
f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。
如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数。
from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
from_what 值为默认为0,即文件开头。下面给出一个完整的例子:
当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
pickle.dump(obj, file, [,protocol])
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
x = pickle.load(file)
序列化例子:
被序列化后的文件:
反序列化例子:
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
mode 参数说明:
Python 还提供了file 和 os 对象的很多方法来处理文件。
Python 有两种错误很容易辨认:语法错误和异常。
语法错误:解析器检查。
异常:运行时。
异常捕捉可以使用 try/except 语句。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
except (RuntimeError, TypeError, NameError):
pass
也可以用“try/except...else”
try-finally 语句无论是否发生异常都将执行最后的代码。
Python 使用 raise 语句抛出一个指定的异常。
raise语法格式如下:
raise [Exception [, args [, traceback]]]
可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承。
语法格式如下:
class ClassName:
.
.
.
实例:
类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用:
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
继承
子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
class DerivedClassName(BaseClassName):
.
.
.
例子:
class DerivedClassName(Base1, Base2, Base3):
.
.
.
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法:
super()函数是用于调用父类(超类)的一个方法。
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定使用 self。
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
Python同样支持运算符重载,我们可以对类的专有方法进行重载: