Second week of learning::
函数
定义:def 函数名(参数):函数体
函数在定义的时候只是在系统中开辟了相应的内存空间,调用的的时候才会执行函数内部命令
1.两个不同的函数,先定义那个后定义那个是没关系的
2.不可以先调用函数在定义函数
带参数的函数:
return
函数中,可以用return返回想返回的结果,函数一旦被调用,就会返回设定的结果,可以在调用的时候用变量进行接收,一个函数可以有返回值也可以没有,但如果有,return后面不能有其他命令,因为return也代表结束整个函数,写在其后面的程序将不会被执行,如果一次返回多个值,系统会默认以元组的方式返回,如果不想以元组方式返回,可以把返回值用列表表示在return
函数与函数之间是相互独立的,不可以共用函数内部变量,但如果函数2想调用函数1的某个变量的值,那就return函数1的这个变量,然后函数2就可以进行调用了
例
函数的嵌套
函数是可以嵌套使用的,也就是说,一个函数定义完,是可以在另一个函数中被调用的。
局部变量和全局变量
函数内部定义的变量叫局部变量,出了函数就不能用了哦,而在函数外部定义的是全局变量,如果函数内部想对全局变量进行修改,就必须要用global 全局变量 这个方法
如何查看函数的文档说明
如何查看函数的文档说明呢?也就是如何查看帮助文档:1.直接用help(函数名)即可 2.将光标置于函数名和括号之间,然后在pycharm标题栏的view里面选中Quick Documentation
函数的注释:不适用#而使用“”“注释”“”的形式,三个引号里的内容可以放入一大堆内容,它可以保留字符串的原始格式,里面的单引号双引号完全不需要进行处理了,但它并不是注释,只是可以当作是注释去使用,它是一个字符串,是真实的数据,三个引号里面的内容太多的时候,也会占用很大的内存的,而#那才是正真的注释,也不会占用内存的空间。
缺省参数
可以在函数定义的时候就写上参数的值,此时的值会被当做默认值,也叫做缺省参数,如果在调用函数时给了缺省参数的值,那就按照给的值调用,如果没给,就按着默认值调用,缺省参数在定义时需放在最后
不定长函数
*args
在函数的定义中def teast(*args): print(args)此时调用函数,函数会自动把输入的字符以元组方式存储,所以如果只输入一个数字或者一个字符,记得在末未加上逗号,否则就不是元组的形式啦
**kwargs
会对传递的参数进行字典的封装
元组、字典的特殊情况
python中的一些小知识点:
python是如何进行内存机制的优化?
答:比如,python中有小整数常量池(小整数缓存池)的机制,它是将-5到256之间的数用的是同一块内存地址。也就是-5到256之间的数的id相同
可变数据类型和不可变数据类型
python中不可变的数据类型为:数字、字符串、元组。
python中可变的数据类型为:字典和列表。
只有不可变的数据类型可以做字典的键
匿名函数:lambda
匿名函数就是用比较简单的的方式,省略了函数的def定义的过程,直接c = lambda a,b:a+b 用c来接收lambda的结果,也相当于调用,无法定义复杂的函数,且只有一个返回值
python的动态体现:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/710d9bed8682d7cd4cd0f93833418787.png)
递归实现的两种方式:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/740d5453d4ccb7185d7742d980e058ac.png)
给程序传参数:sys模块中的argv不仅可以得到当前程序的文件名以及后面的一些参数信息,以列表的形式进行返回
字符串
字符串中不可以用“” “”或者‘’ ‘’这种形式,有了双引号再进行嵌套时就得用单引号啦
字符串有以下方法:
python 自带模块:OS模块的应用
python中自带模块:uuid模块
UUID是通用唯一识别码(Universally Unique Identifier)的缩写,UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的,因为它们是不会被复制的独特标识符。
uuid(1):
根据当前的时间戳和MAC地址生成的,最后的12个字符408d5c985711对应的就是MAC地址,因为是MAC地址,那么唯一性应该不用说了。但是生成后暴露了MAC地址这就很不好了。
uuid(3):
基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。就是说如果name一致则生成的uuid3是一样的,你可以测试下不管运行多少次都是一样的uuid3。
uuid(4):
这是基于随机数的uuid。既然是随机就有可能真的遇到相同的,几率超小,也基本上是不会重复的,因为是随机而且使用还方便,所以使用这个的还是比较多的。
uuid(5):
和基于名字的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法,和uuid3差不多,uuid3用的是MD5算法,uuid5用的是SHA1算法, 如果你name不换,生成的uuid5一直是同一个。
面向对象
面向对象通过类的封装,可以解决程序的复用的问题
类和对象的关系
面向对象编程的2个非常重要的概念:类和对象
对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类
类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象。
类的构成
类(Class) 由3个部分构成:
① 类的名称:类名
② 类的属性:一组数据
③ 类的方法:允许对进行操作的方法 (行为)
__init__方法:创建一个对象后就会自动调用,所以一般用作对象的初始化
__str__方法:当对对象进行打印时,会自动打印该对象内存地址,不想打印这个就可以用这个方法,其中设置return值就是我们打印该对象时出现的内容
del:如果当程序结束的时候还有引用数,先执行程序结束的代码,再去调用此方法
隐藏属性:用get(),set()方法
私有属性、私有方法 :1.起名字是__开头 2.私有的不能在类的外面去使用,可以在类里面的任何地方进行使用
在继承的情况中:1、子类对象不能在自己的方法内部,直接访问父类的私有属性或私有方法。
2、子类对象可以通过父类的公有方法间接访问到私有属性或私有方法。
继承
1.单继承:
class 类名(父类名):pass
c继承了b,b又继承了a,则c也间接地继承了a
2.多继承:
class 类名(父类名1,父类名2,。。。):pass
如何让父类针对不同的子类进行返回不同的内容???:
1.使用super()
2.也可以使用:isinstance(obj, Class) 布尔函数:如果object是B类的实例对象,那么就返回真True。也就是判断一个对象是不是这个类实例化出来的
方法的重写
1.重写
如果在开发中,父类的方法实现和子类的方法实现完全不同,就可以使用覆盖的方式,在子类中重新编写父类的方法实现。
具体的实现方式:就相当于在子类中定义了一个和父类同名的方法并且实现。
重写之后,在运行时,只会调用子类中重写的方法,而不再会调用父类封装的方法。
2.拓展
如果在开发中,子类的方法实现中包含父类的方法实现,也就是父类原本封装的方法实现是子类方法的一部分,就可以使用扩展的方式。
具体步骤:
1、在子类中重写父类的方法。
2、在需要的位置使用super().父类方法来调用父类方法的执行。
3、代码其他的位置针对子类的需求,编写子类特有的代码实现。