Python学习笔记(3)函数与类

 Max.C     2020-02-27   3402 words    & views

一、函数

1、格式

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

调用格式:[var = ]function(elem)

2、参数传递

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

  • 不可变类型:值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。
  • 可变类型:类引用传递,如 列表,字典。

(1)固定实参传递

def fun(A,B=2,C=5):
	return A+B+C

res1 = fun(1,2,3)	#位置传递
res2 = fun(A=1, C=2, B=3)	#关键字传递
res3 = fun(2)	#默认参数

(2)传递列表

def fun(A):
	A.pop()

lis = [1,2,3,4,5]
fun(lis[:]) # 传递副本
print(lis)

fun(lis)	#传递原型(指针)
print(lis)

输出结果:

[1, 2, 3, 4, 5]
[1, 2, 3, 4]

------------------
(program exited with code: 0)

(3)任意数量实参

def function_name([elem,] *elems ):
  '''
  data
  '''
	code...
  return result

加了星号 *** 的参数会以元组的形式导入,存放所有固定形参**之后的参数;

如果在函数调用时没有指定参数,它就是一个空元组;

带 * 参数必须放在参数列表的最后。

def printinfo( arg1, *vartuple ):     
  print ("输出: ")  
  print (arg1)
  print (vartuple) 
  
printinfo( 70, 60, 50 ) # 调用

输出结果:

70
(60, 50)

------------------
(program exited with code: 0)

加了两个星号 ** 的参数会以字典的形式导入,存放所有固定形参之后的参数;

def functionname([formal_args,] **var_args_dict ):
  '''
  data
  '''
	code...
  return result

调用时,可以使用{key:value}格式,也可以如下使用key = value格式:

def printinfo( arg1, **vardict ):       
  print ("输出: ")    
  print (arg1)    
  print (vardict)   

# 调用printinfo 函数 
printinfo(1, a=2,b=3)

输出结果:

1
{'a': 2, 'b': 3}

------------------
(program exited with code: 0)

二、类

封装的数据类型,类的变量称为属性,类的成员函数称为方法

# 这个类用于下面内容的说明
class Animal():
	def __init__(self, name='', age=1):
		self.name = name
		self.age = age
		self.level = 0
	def level_up(self):
		self.level++

1、定义

(1)格式

class ClassName():
	'''data'''
	def __init__(self,var...)
		# code
	def function(self,arg...)
		# code

(2)构造函数

def __init__(self,var...)
		# code

开头末尾分别有两个下划线,参数self指向实例本身,用于访问类的属性、方法;

构造函数用于初始化类的实例;

(3)类方法,类属性

类方法必须包含参数self, 且为第一个参数:

class ClassName():
	# ...
	def function(self,arg...)
		# code

类属性、类方法可以以两个下划线开头,表示私有属性,在类外部无法直接进行访问;

2、使用

(1)初始化

var = ClassName(arg...)

(2)访问

var.name访问属性,var.name()访问方法;

访问类方法时,实参不需要包含self

3、继承

(1)定义

#类定义
class BaseClassName1():
    #定义属性
    #定义构造方法
    def __init__(self,arg...):
			#code
    def (self,arg...):
			#code
 
#单继承
class DerivedClassName(BaseClassName1):
    def __init__(self,arg...):
        #调用父类的构函
        BaseClassName1.__init__(self,arg...)
    #添加、覆写其他方法

BaseClassName必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时,这一点非常有用:

class DerivedClassName(modname.BaseClassName):

(2)重定义

子类方法可以与父类相同,子类实例默认调用子类方法;

同时,如果需要调用父类方法,可以使用super()函数;

class Parent:        # 定义父类
  def myMethod(self):
  	print ('调用父类方法')

class Child(Parent): # 定义子类
  def myMethod(self):
  	print ('调用子类方法')

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法

(3)多继承

class DerivedClassName(Base1, Base2, Base3):
	#code

三、模块

保存程序代码的.py独立文件,可以导入其他程序程序中。

1、格式

(1)导入整个模块

import module_name将模块中所有代码导入该程序中;

调用导入模块的函数时,使用module_name.function_name()调用;

(2)导入特定函数

from module_name import function_1,function_2....module_name.py中导入对应函数;

调用导入函数时,使用function_name()调用(无需加上模块名);

(3)导入类

from module_name import class_1,class_2....module_name.py中导入对应类;

使用类时,使用Class_name()调用(无需加上模块名);

2、别名

(1)给模块指定别名

import module_name as md

(2)给函数/类指定别名

from module import function_name as fc

from module import class_name as Cl

3、Python标准库

(1)随机数函数

模块 random 包含以各种方式生成随机数的函数,其中的 randint()返回 一个位于指定范围内的整数,例如,下面的代码返回一个 1~6 内的整数:

from random import randint
x = randint(1, 6)