Python的基本知识——流程控制、函数、对象、类和垃圾回收

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/suoyue_py/article/details/99710036

基本处理流程

是指对数据结构的处理流程。在Python中,基本的处理流程包含三种结构

  • 顺序结构:按语句出现的先后顺序依次执行
  • 选择结构 :按照给定的逻辑条件来决定执行顺序,有单向选择、双向选择和多向选择之分,但程序在执行过程中都只执行其中一条分支。
  • 循环结构:根据代码的逻辑条件来判断是否重复执行某一段程序,若逻辑条件为true,则进入循环重复执行,否则结束循环。循环结构可分为条件循环和计数循环。

if-elif-else条件判断语句
while循环语句: 可以与else配合使用,表示当while语句的表达式为False时,执行else的语句块。
for循环语句: 由条件控制和循环两部分组成
语法格式:

for <variable> in <sequence>:
   语句
else:
   语句

其中variable是一个变量名称,sequence则是一个列表
else语句运行的时机是当for语句都没有运行,或是最后一个循环已经运行时。else语句是可省略的。
循环体常常结合continue(跳过当前循环块中的剩余语句,继续进行下一轮循环)和break(跳出循环)语句
pass是空语句,主要为了保持程序结构的完整性。pass不做任何事情,一般用做占位语句。
如果需要遍历数字序列,通常会用到range()和len()函数,结合循环控制语句,将起到事半功倍的效果。

函数

Python的函数定义方法是使用def关键字,语法格式 如下所示:

def 函数名称(参数1, 参数2, …):
“文件字符串”
<语句>

文件字符串是可省略的,用来作为描述此函数的字符串。如果文件字符串存在的话,它必须是函数的第1个语句。
Python函数的参数传递,都是使用传址调用的方式。所谓传址调用就是将该参数的内存地址传过去,如果参数在函数内被更改时,则会影响到原有的参数。参数的数据类型可以是模块,类,实例(instance),或是其他的函数,用户不必在参数内设置参数的数据类型。调用函数时可使用的参数类型包括必需参数、关键字参数、默认参数和不定长参数。
return语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。
加载Python解释器之后,读者就可以直接使用内置函数。下面将讲述常见内置函数的使用方法。
abs(x): 返回数值x的绝对值,如果x是复数的话,abs()函数会返回该复数的大小(实数部分的平方加上虚数部分的平方,再开根号)。例如:
>>> abs(-3.12)
3.12
>>> abs(1+2j)
2.23606797749979
chr(i): i是ASCII字符码(0~255),chr()函数返回数值i的单字符字符串。chr()函数与ord()函数作用相反。下列案例求取ASCII字符码97的字符:
>>> chr(97)
‘a’
函数的内置属性和命名空间
函数有许多的内置属性,用户可以在Python解释器内输入dir(函数名称),即可以显示这些内置属性。
输入和输出函数
Python的内置函数input()和print()函数用于输入和输出数据。
print ()函数输出默认是换行的,若要实现不换行可在变量末尾加上end=" “。
格式:print (输出数据,end=” ")

面向对象程序的主要特性

  • 封装(encapsulation):数据仅能通过一组接口函数来存取,经过封装的数据能够确保信息的隐密性。
  • 继承(inheritance):衍生类(derived class)继承了其基础类(base
    class)的成员变量(data member)与类方法(class
    method)。衍生类也叫做次类(subclass),或是子类(child class)。基础类也叫做父类(parent class)。
  • 多态(polymorphism):多态允许一个函数,有许多种不同的接口。依照调用函数时使用的参数,类知道使用哪一种接口。Python使用动态类型(dynamic
    typing),与后期绑定(late binding)来做到多态的功能。

类(class)

将具有相同属性及相同行为的一组对象称为类(class)。广义地讲,具有共同性质的事物的集合就称为类。
在面向对象程序设计中,类是一个独立的单位,它有一个类名,其内部包括成员变量,用于描述对象的属性;还包括类的成员方法,用于描述对象的行为。
类是一个抽象的概念,要利用类的方式来解决问题,必须用类创建一个实例化的对象,然后通过对象去访问类的成员变量,去调用类的成员方法来实现程序的功能。
每一个类都有它自己的命名空间,所有的设置与函数定义都在此命名空间内发生。

类的定义
是使用封装的数据,以及操作这些数据的接口函数,所组成的一群对象的集合。类可以说是,创建对象时所用的模板(template)。Python使用关键字class来定义类。
语法如下:

class <类名称>:
  [“文件字符串”]
<语句>

<语句>内包含任何有效的Python语句,用来定义类的属性与方法。“文件字符串”是语句此类的字符串,可以省略。

类的构造方法和内置属性
所谓构造方法(constructor)就是创建对象时,对象本身所运行的函数。Python使用__init__() 函数作为对象的构造方法。当用户要在对象内指向对象本身时,可以使用self关键字。Python的self关键字与C++的this关键字一样,都是代表对象本身。
所有Python类都具有下列属性:
a、.__ dict __ : 属性以字典对象的方式存储,属性为字典对象的值
b、.__ doc __ : 属性返回类的文件字符串
c、.__ name __ : 属性返回类的名称
d、.__ module __ : 属性返回包含类的模块名称
e、.__ bases __ : 属性是一个tuple对象,返回类的基类名称

类的内置方法
类本身有许多的内置方法,这些内置方法的开头与结尾都是双底线字符。
a、 __ init __(self): 这是类的构造方法,当创建一个类的实例时,就会调用此方法。
b、 __ str __(self): 此方法被str()内置函数与print函数调用。用来设置对象以字符串类型出现时如何显示,str()函数的返回值是一个字符串对象。
c、 __ repr __(self): 此方法被repr()内置函数调用,此函数可以让对象以可读的形式出现
d、 __ getattr __(self, name): 此方法用在读取或是修改不存在的成员属性的时候。

类实例
要创建一个类实例时,只要指定变量给类名称即可。
⑴ 使用id() 内置函数,可以返回类的识别码(identity)。
⑵ 使用type() 内置函数,可以返回类的对象类型(object type)。
所有Python的类实例,都具有下列的内置属性:
⑴ obj.dict:类实例内的属性是以字典对象的方式存储。__dict__属性为此字典对象的值。
⑵ obj.class:__class__属性返回创建此类实例所用的类名称。

重载运算符(overloading operator)
类的内置方法中用来替换运算符功能的特性
要在Python解释器内使用这些运算符函数,首先必须加载operator模块,然后调用operator模块的运算符函数。
在这里插入图片描述
类的继承(inheritance)
就是新类继承旧类的属性与方法,这种行为称为派生子类(subclassing)。继承的新类称为派生类(derived class),被继承的旧类则称为基类(base class)。当用户创建派生类后,就可以在派生类内新增或是改写基类的任何方法。
派生类的语法如下所示:

class <类名称> [(基类1,基类2, ...)]:
  [“文件字符串”]
<语句>

一个衍生类可以同时继承自许多个基类,基类之间以逗号(,)隔开。
命名空间的搜索顺序:类的实例->类->基类

类的多态(polymorphism)
就是类可以有许多个相同名称,但参数类型不同的函数。
Python并没有明显的多态特性,因为Python函数的参数不必声明数据类型。但是利用动态数据类型(dynamic typing),Python仍然可以处理对象的多态。
由于使用动态数据类型,Python必须等到运行该函数时才知道该函数的类型。这种特性称为运行期绑定(runtime binding)。
C++将多态(polymorphism)称为方法重载(method overloading),C++可以允许类内有许多个相同的名称、却有不同参数的函数存在,Python则不允许,会使用类内最后一个声明的函数

类的封装(encapsulation)
就是类将其属性(变量与方法)封装在该类内。只有该类中的成员,可以使用到该类中的其他成员。这种被封装的变量与方法,称为该类的私有变量(private variable)与私有方法(private method)。
Python类中的所有变量与方法,都是公用的(public)。只要知道该类的名称,与该变量或是方法的名称,任何外部的对象都可以直接存取类中的属性与方法。
如下例所示,x是myClass类的实例变量,name是myClass类的变量。利用x.name就可以存取到myClass类中的name变量。

>>> class myClass:
      def __init__(self):
         self.name = None

类封装的两个原则:

  • 属性(变量与方法)名称的第一个字符如果是单底线,则此属性视为类的内部变量,外部的变量不能引用此属性
  • 属性(变量与方法)名称的前两个字符如果都是单底线,则当编译时属性名称attributeName会被改成_className__attributeName,className是该类的名称。由于属性名称之前加上了类的名称,所以与类中原有的属性名称就有差异。

元类
就是一个类用来当作创建其他类的模板(template)。一般来讲,用户使用类来创建类实例变量。使用元类的目的是以某些类为基准,来创建metaclass类。然后将元类当作要创建的类的基类。
使用元类让用户有机会可以存取与改变Python的内部类。利用元类创建的元实例,可以让操作对象属性的工作更容易。

垃圾回收

Python使用了引用计数这一简单技术来跟踪和回收垃圾。
在Python内部,有一个内部跟踪变量,记录着所有使用中的对象各有多少引用,称为一个引用计数器。
当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,这个对象的引用计数变为0时,它被垃圾回收。但是回收不是"立即"的,由解释器在适当的时机,将垃圾对象占用的内存空间回收。

猜你喜欢

转载自blog.csdn.net/suoyue_py/article/details/99710036
今日推荐