python基础之递归,声明式编程,面向对象(一)
在函数内部,可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归效率低,需要在进入下一次递归时保留当前的状态,解决方法是尾递归,即在函数的最后一步(而非最后一行)调用自己,但是python又没有尾递归,而且
对递归的层级做了限制
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每
当函数返回,栈就会减一层帧。由于栈的大小是无限的,所以当递归调用次数过多,会导致栈溢出)
递归函数的应用
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] #声明一个包含数字的列表
def search(num,data):
if len(data)>1:
mid_index=int(len(data)/2) #中间数字的索引等于data列表的长度除以2
mid_value=data[mid_index] #中间数字的值等于列表data[索引]
if num > mid_value: #如果输入的数字大于列表中间值
data=data[mid_index:] #取列表的后半段,也就是列表切片
search(num,data) #调用函数
elif num < mid_value: #如果输入的数字大于列表中间值
data=data[:mid_index] #取列表的前半段,也就是列表切片
search(num,data) #调用函数
else:
print('find it') #猜对了
else:
if data[0]==num: #列表元素变成一个时,正好猜到最后一个值
print('find it') #猜对了
else:
print('not exists') #要找的数字不存在
search(17,data) #调用函数
声明式编程:
#列表解析
l=[expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN
]
#生成器表达式
g=(expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN
)
面向过程编程特点:
面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了程序的复杂度
缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向对象编程:
总结:
类:一:实例化,二:引用名字(类名.变量名, 类名.函数名)
实例:引用名字(实例名.类的变量,实例名.绑定方法,实例名.实例自己的变量名)
定义类和定义函数相似。
把抽象的或者不存在的东西加一个括号得到一个具体存在的对象,这个过程叫实例化 英雄联盟游戏实例:
实例1:
class Garen: #一堆对象提取共同的特征产生类,由类产生一个个具体的对象,类是盖伦
camp='Demacia' #camp(阵营)-->德玛西亚
def attack(self):
print('attack')
# 如何使用类
# 一:实例化
x=int(10)
print(x) obj=Garen() #实例化:Garen加括号,这是一个类执行,由类产生一个具体存在的对象,
print(obj)
#二:引用类的特征(累的变量)和技能(类的函数)
print(Garen.camp)
print(Garen.attack) #调用的就是函数 print(Garen.attack(1037727983))
实例2:
class Garen: #一堆对象提取共同的特征产生类,由类产生一个个具体的对象,类是盖伦
camp='Demacia' #camp(阵营)-->德玛西亚
def attack(self):
print('attack')
def __init__(self,nickname):
self.nick=nickname #g1.nick='草丛伦'
def attack(self,enemy):
# print('----->',self.nick) #g1.nick
print('%s attack %s' %(self.nick,enemy))
print(Garen.camp) #查
Garen.camp='aaaaa' #改
print(Garen.camp) del Garen.camp #删除
print(Garen.camp) Garen.x=1 #添加
print(Garen.x)#输出 g1=Garen('alex') #添加一个攻击的目标'alex'
print(g1.nick) #输出'alex'
g1.nick='asb' #更改nick目标alex为'asb'
print(g1.nick) #输出'asb'
del g1.nick g1.sex='female' #添加性别为女性
print(g1.sex) #输出sex
实例3:
class Garen: #一堆对象提取共同的特征产生类,由类产生一个个具体的对象,类是盖伦
camp='Demacia' #camp(阵营)-->德玛西亚阵营 def __init__(self,nickname): #nickname:别名
self.nick=nickname #g1.nick='草丛伦
def attack(self,enemy):
print('------------>',self.nick)#self.nick就是找self下有没有类
print('attack %s' %enemy)
g1=Garen('草丛伦') #草丛伦直接传给nickname,把nickname给self下面的一个名字nick,Garen.__init__(g1,'草丛伦'),本质上就是触发__init__的执行
g2=Garen('猥琐轮')
Garen.attack(10) #调用的就是函数
print(g1.nick)
g1.attack('alex') #g1的值传给self,也就是self=g1
Garen.attack(g1) #对象调用自己的绑定方法 print(g1)
print(g1.nick)
print(g1.camp)
print(g1.attack)# <bound method Garen.attack of <__main__.Garen object at 0x00000035A6A6CF60>>绑定方法,绑定给g1
print(Garen.attack) #<function Garen.attack at 0x00000035A6A6E950>就是普通函数 print(g2.nick)
print(g2.camp)
print(g1.attack) 总结:
类:一:实例化,二:引用名字(类名.变量名,类名.函数名)
实例:引用名字(实例名.类的变量,实例名.绑定方法,实例名.实例自己的变量名)
python基础之递归,声明式编程,面向对象(一)的更多相关文章
- 十四. Python基础(14)--递归
十四. Python基础(14)--递归 1 ● 递归(recursion) 概念: recursive functions-functions that call themselves either ...
- 第七章:Python基础のXML操作和面向对象(一)
本課主題 XML介绍与操作实战 shutil 模块介绍与操作实战 subprocess 模块介绍与操作实战 初探面向对象与操作实战 本周作业 XML介绍和操作实战 對於浏览器返回的字符串有以下幾種: ...
- Python基础系列----函数,面向对象,异常
1.前言 前 ...
- python基础之反射、面向对象进阶
isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True 1 class F ...
- Python基础(11)--面向对象1
面向对象设计与面向对象编程的关系 面向对象设计(OOD)不会特别要求面向对象编程语言.事实上,OOD 可以由纯结构化语言来实现,比如 C,但如果想要构造具备对象性质和特点的数据类型,就需要在程序上作更 ...
- Python基础(十一)-面向对象
三种编程范式: 1.函数式编程:函数指数学意义上的函数 由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好处主要是不可变性带来的.没有可变的状态,函数就是引用透明(Ref ...
- python基础(11)--面向对象
1.概述 面向过程:根据业务的逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发更快更好更强 面向过程编程最易被初学者接受 ...
- python基础之模块,面向对象
hash 什么是hash? hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值 为何用hash? hash值有三大特性: 1.只要传入的内容一样,得到的hash值必然一样 2.只要使 ...
- python基础--常用模块与面向对象基础
1常用模块 1.1 xml xml是实现不同语言或程序之间进行数据交换的协议 xml的格式如下: <?xml version="1.0"?> <data> ...
随机推荐
- MariaDB备份和恢复
一.为什么要备份? 灾难恢复:硬件故障.软件故障.自然灾害.黑客攻击.误操作: 测试二.要注意的要点: 能容忍最多丢失多少数据: 恢复数据需要多长时间内完成: 需要恢复哪些数据: (1)做还原测试,用 ...
- vue项目如何打包扔向服务器
vue项目如何打包扔向服务器 当我们将 vue 项目完成后,面临的就是如何将项目进行打包上线,放到服务器中.我使用的是 vue-cli(simple) 脚手架,所以就讲一下如何将项目进行打包,并放 ...
- SQL基础一
一.什么是SQL? SQL是结构化查询语言 SQL使我们有能力访问数据库 SQL是一种ANSI的标准计算机语言 二.SQL能做什么? SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可 ...
- Node.js API学习笔记(二)
本文发表于本人博客. 上一节笔记说到创建Buffer实例,这节继续讲Buffer.本节讲解下Buffer的一些静态方法.写入以及读取方法. Buffer.isEncoding(编码)判断nodejs是 ...
- MyBatis For .NET学习- 初识MyBatis
MyBatis的框架. Introduction MyBatis本是apache的一个开源项目iBatis,2010年这个项目由 apache software foundation迁移到了googl ...
- maven入门学习(一)
一.maven介绍 1.软件开发中我们为什么要使用maven呢?(纯属个人体会观点,如有错误,敬请指正) (1)其一,企业岗位需求,目前的IT开发招聘岗位上,基本都要求会使用maven. ...
- JSONP跨站访问
js中几种实用的跨域方法原理详解 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协 ...
- 去掉xml中的空格和换行符
有时在拼接xml或是导入xml格式文件时,会无缘无故出现很多空格符合换行符,导致在转换json时会报各种错误,特此在网上找到了一中比较实用的方法: strxml = Regex.Replace(str ...
- Linux系统下使用pwgen生成密码的使用教程
pwgen生成的密码易于记忆且相当安全.从技术上来说,容易记忆的密码不会比随机生成的密码更加安全.但是,在大多数情况下,pwgen生成的密码已经足够安全,除了网银密码等需要高安全等级的情况外.使用易于 ...
- java获取当前文件路径 [转]
1.如何获得当前文件路径 常用: 字符串类型:System.getProperty("user.dir"); 综合: package com.zcjl.test.base; imp ...