1、函数的定义:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。分为内置函数和用户自定义函数。
2、函数的创建规则:函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
函数的调用:定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,便可以通过另一个函数调用执行,也可以直接从Python提示符执行。
例如计算字符串长度:
无函数:
n=0
for c in "helloworld":
n = n + 1
print(n)
获取一个字符串长度是常用的功能,如果每次都写这样一段重复的代码,不但费时费力、容易出错,也很麻烦。可将此过程定义为一个函数便有:
#自定义 len() 函数
def my_len(str):
length = 0
for c in str:
length = length + 1
return length
#调用自定义的 my_len() 函数
length = my_len("helloworld")
print(length)
'''
在变量定义和函数名定义的时候,一定不可随便定义,要用清晰地英文组合表达出贴近的意思,突出函数的功能。
'''
注意:如果读者接触过其他编程语言中的函数,以上对于函数的描述,肯定不会陌生。
但需要注意的一点是,和其他编程语言中函数相同的是,Python 函数支持接收多个
参数,不同之处在于,Python 函数还支持返回多个值。
调用函数也就是执行函数。调用函数就相当于使用定义过的工具。
函数调用的基本语法格式如下所示:
[返回值] = 函数名([形参值])
其中,函数名即指的是要调用的函数的名称;形参值指的是当初创建函数时要求传入的各个形参的值。如果该函数有返回值,我们可以通过一个变量来接收该值,当然也可以不接受。
需要注意的是,创建函数有多少个形参,那么调用时就需要传入多少个值,且顺序必须和创建函数时一致。即便该函数没有参数,函数名后的小括号也不能省略。
函数的递归:
定义:在调用一个函数的过程中直接或间接的调用该函数本身,称之为递归调用。递归调用最多能调用999层。
简单:
def func():
print('A')
func() #直接调用自身
func():
间接调用:
def func():
print('A')
bar() #间接调用自身
def bar():
print("B")
func()
func()
这是个死循环过程,要加上适合的结束条件
总体来说:
递归分为两个重要的阶段: 递推+回溯
递推:函数不断减少问题规模直至最终的终止条件。
回溯:拿到最终明确的值后,返回给上次调用进行处理,直至初始层。
注意:
1、递归调用必须有一个明确的结束条件
2、在python中没有尾递归优化,递归调用的效率不高
3、进入下一次递归时,问题的规模必须降低
python类与对象
作为面向对象的编程语言,Python中一切皆对象(object),例如字符串、元祖、列表等都是对象。而类(class)则是描述具有相同属性(Arrtibute)和方法(MethoD)的对象的集合。
简单来说:对象=属性+方法
类=具有相同属性和方法的对象的集合
面向对象编程语言
- 类: 一个模板---是一个抽象的, 没有实体的
- 对象: (eg: 张三, 李四)
- 属性: (表示这类东西的特征, 眼睛, 嘴巴, 鼻子)
- 方法: (表示这类物体可以做的事情, eg: 吃饭, 睡觉,学习)
继承关系和实例关系:
----对象体系中有两种关系:继承体系和实例关系。
继承关系好比父子关系,子类继承于父类,并拥有自身及父类的方法和属性,同名的子类方法和属性将覆盖父类的方法和属性。实例关系则是一个抽象到具体的过程,实例是某个类中具体的个体的表示。
例子:
class human(object):
def __init__(self, name, age, gender):
# python解释器自动将对象传给self这个形参.
# 看self到底是什么东西?
# 将对象与该对象的属性绑定在一起.
# 调用对象的属性两种方式:
# - 张三.name
# - self.name
self.name = name # 属性
self.age = age # 属性
self.gender = gender # 属性
print(self) # 实质上是一个对象
# 方法(在类里面定义的函数, 叫做方法)
def eat(self):
print("%s 正在运动" %(self.name))
创建对象:张三 = human("张三", 10, 'male')
print("张三:", 张三)
类的私有属性与私有方法:
类的私有属性:
__private_attrs:
两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。
类的方法:
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的(因为是形参),也可以使用 this,但是最好还是按照约定是用 self。
类的私有方法:
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,
不能在类地外部调用。self.__private_methods。
迭代器:
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
print (x)
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
while True:
try:
print (next(it))
except StopIteration:
sys.exit()
创建一个迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
输出的结果为1
2
3
4
5
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。