一、算法(二分法)

前引:算法就是高效解决问题的办法

算法之二分法

需求:有一个从小到大顺序排列的列表,如何高效的找到其中一个值

方案一、for循环(遍历效率太低)

for num in nums:
if num == find_num:
print('find it')
break

方案二、二分法

list1 = [1,4,5,6,7,8,9,10,15,48,98,99,789,10000]
def twocut_serch(find_num,fine_list):
print(fine_list)
if fine_list==[]:
print("找不到")
return
mid =len(fine_list)//2
half_num = fine_list[mid]
if half_num>find_num:
#查左边
twocut_serch(find_num,fine_list[:mid])
elif half_num<find_num:
twocut_serch(find_num,fine_list[mid+1:])
else:
print("找到了")
twocut_serch(2,list1)

二、面向过程与函数式

1 编程范式/思想

在我们写代码的时候我们从何入手,不同的思想会让我们有不同的着重点。

面向过程和函数式便是众多编程思想中的两个流派

强调:不同的范式应用于不同场景他们本身没有好坏之分

2 面向过程

面向过程的重点就是过程,做一件事要先做什么,后做什么,类似于流水线

优点:讲复杂的问题流程化,简单化

缺点:程序的可扩展性差,因为一套流程通常是死的,我们通常不能用a流程去完成b事物

应用场景:面向过程的程序设计一般用于那些功能一旦实现之后就很少需要改变的场景, 如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程去实现是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护, 那还是用面向对象最为方便。

3 函数式

函数式编程并非用函数编程这么简单,而是将计算机的运算视为数学意义上的运算,比起面向过程,函数式更加注重的是执行结果而非执行的过程,代表语言有:Haskell、Erlang。而python并不是一门函数式编程语言,但是仍为我们提供了很多函数式编程好的特性,如lambda,map,reduce,filter

3.1 匿名函数与lambda

1 .def定义有名函数

#func是存放函数的内存地址的名字
def func(x):
return x

2 .lambda

#匿名函数定义
#lambda 参数1,参数2...:返回值 lambda x,y:x+y def func(x,y):
return x+y #函数调用
res = (lambda x,y:x+y)(1,2)
#匿名函数由于没有名字的特性,所以如果不绑定名字的话,在函数定义结束后就被当做垃圾回收了,
#所以通常情况下都是直接在定义时执行函数,通常用做其他函数连用 func(1,2)

3.匿名函数和内置函数的应用

需求:定义一个字典,取出其中value最大的key和value最小的key

dict1 = {"hz":100,"lxt":1234,"hzxc":101}
#max,min的工作原理都是迭代器
#取出其中value最大的key
#max的第一个值(需要找最大值的可迭代对象,如果是字典,找最大key)
res = max(dict1,key=lambda k:dict1[k]) #取出其中value最大的key
res = min(dict1,key=lambda k:dict1[k]) #补充 sorted排序
sorted(dict1)#默认给key排序,得到一个列表

map,reduce,filter(了解知识)

map

#map = 映射
#把一个可迭代对象的每一个值拿出来当做函数的参数运行一次
l = [1,2,3,4]
res = map(lambda x:x**2,l)
#res是一个迭代器,它里面存放着l的每一个元素的平方

reduce

#reduce函数可以接收三个参数,一个是函数,第二个是可迭代对象,第三个是初始值
from functools import reduce
l = [1,2,3,4]
res = reduce(lambda x,y:x+y,l)
print(res)
>>>10
#1 没有初始值,reduce函数会先迭代一次array得到的值作为初始值,作为第一个值数传给x,
#然后继续迭代一次l得到的值作为第二个值传给y,运算的结果为3 #2 将上一次reduce运算的结果作为第一个值传给x,然后迭代一次l得到的结果作为第二个值传给y,
#依次类推,知道迭代完l的所有元素,得到最终的结果10

filter

#过滤列表l
l = [1,2,3,4]
res = filter(lambda x:x>3,l)
#filter会迭代列表l把得到的值传给匿名函数,如果得到结果为真,则过滤出该元素,得到一个迭代器
res >>> 4

三、模块

1 什么是模块

模块就是一系列功能的集合体,分为三大类

  1. 内置模块
  2. 第三方模块
  3. 自定义模块(一个py文件本身就是一个模块,文件名:m.py,模块名:m)
ps:模块有四种形式
  1 使用python编写的.py文件   2 已被编译为共享库或DLL的C或C++扩展   3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)   4 使用C编写并链接到python解释器的内置模块

2 为何要有模块

原因一、内置和第三方模块拿来就用,无需定义,这种拿来主义,可以极大的提升自己的开发效率

原因二、自定义模块

​ 可以将程序的各部分功能提取到一个模块供大家一起使用

​ 好处是减少了代码冗余

3 怎么用模块

3.1第一次导入模块会发生3件事情:

  1. 产生该模块的的名称空间,将foo.py运行过程中产生的名字传给foo的名称空间中
  2. 执行foo.py
  3. 在当前文件内产生一个名字foo,把名字指向1中的名称空间

ps:重复导入不会重复执行代码

3.2引用:

引用foo内的变量:foo.x

引用foo内的函数:foo.get()

ps:此处对foo.py引用的名字不会和当前名称空间冲突

ps:可以用分隔符同行导入多个模块(不建议使用)

3.3导入模块的规范:

前:python内置模块

中:第三方模块

后:程序员自定义模块

day20 函数收尾+面向过程+模块的更多相关文章

  1. Day5_协程函数_面向过程

    def func(count): while True: yield count count +=1 #这是一个生成器,需要利用next()来执行. func(10) #yield: #1.把函数的执 ...

  2. Python函数之面向过程编程

    一.解释 面向过程:核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计,流水线式的编程思想,在设计程序时,需要把整个流程设计出来, 一条工业流水线,是一种机械式的思维方式 二.优 ...

  3. python-迭代器、生成器、内置函数及面向过程编程

    一.迭代器 迭代器是迭代取值的工具,迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的. 为什么要用迭代器呢? 1.可以不依赖索引取值 2.同一时刻在内存中只有一个值,不会过多的占用内存 如何 ...

  4. day14-二分法、匿名函数、内置函数以及面向过程编程

    目录 二分法 匿名函数 内置函数 面向过程编程 二分法 二分法查找适用于数据量较大时,但是数据需要先排好顺序.主要思想是:(设查找的数组区间为array[low, high]) (1)确定该区间的中间 ...

  5. Python基础(9)_生成器(yield表达式形式)、面向过程编程

    一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...

  6. python自动化开发-[第五天]-面向过程、模块、包

    今日概要: 1.内置模块 2.协程函数 3.递归 4.面向过程编程与函数编程 5.模块 6.包 7.re正则 一.内置模块 1.匿名函数lambda 定义:匿名函数通常是创建了可以被调用的函数,它返回 ...

  7. Python面向过程、模块的使用

    一.Python面向过程 ''' 面向过程编程 核心过程二字,过程指的是解决问题的步骤,即先干什么.再干什么.然后干什么... 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式 优点 ...

  8. python基础----迭代器、生成器、协程函数及应用(面向过程实例)

    一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...

  9. 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程

    目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...

随机推荐

  1. 简述hadoop安装步骤

    简述hadoop安装步骤 安装步骤: 1.安装虚拟机系统,并进行准备工作(可安装- 一个然后克隆) 2.修改各个虚拟机的hostname和host 3.创建用户组和用户 4.配置虚拟机网络,使虚拟机系 ...

  2. Windows学习Nodejs、Npm和VUE

    前言 本文主要以开发的角度讲解Node.js,Npm和Vue. Node.js学习 什么是Node.js Node.js简单来说就是一个IISExpress,提供一个前端Html的独立运行环境. 安装 ...

  3. PL/SQL编程急速上手

    结构化查询语言(SQL)是第四代编程语言的典型,这种命令式的语言更像一种指令,使用它,你只需要告诉计算机“做什么”,而不用告诉计算机“怎么做”.第四代编程语言普遍具有简单.易学.能更快的投入生产等优点 ...

  4. Pycharm下安装Numpy包

    Numpy--Numerical Python,是一个基于Python的可以存储和处理大型矩阵的库.几乎是Python 生态系统的数值计算的基石,例如Scipy,Pandas,Scikit-learn ...

  5. 在android项目中使用FontAwesome字体

    在android项目中使用FontAweSome图标集,可以方便的适配各种屏幕分辨率,不必在各种不同分辨率文件夹中新建资源文件.使用字体是一种很巧妙的方法,把图像以字体的方式呈现,这样以前设置为and ...

  6. Java中在数字前自动补零方法

    /** * 数字前面自动补零 * @param number 数字 * @return */ public static String geFourNumber(int number){ Number ...

  7. Jmeter各种组件

    断言 用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中的数据交互与预期一致 参数化关联 参数化:指对每次发起的请求,参数名称相同,参数值进行替换,如登录三次系统,每次用不同的用户名和 ...

  8. TLS1.2协议设计原理

    目录 前言 为什么需要TLS协议 发展历史 协议设计目标 记录协议 握手步骤 握手协议 Hello Request Client Hello Server Hello Certificate Serv ...

  9. 解决 React Native Android:app:validateSigningRelease FAILED 错误

    RN 运行的时候报这个错这咋办:

  10. js事件入门(1)

    1.事件相关概念 1.1 什么是事件? 事件是用户在访问页面时执行的操作,也就是用户访问页面时的行为.当浏览器探测到一个事件时,比如鼠标点击或者按键.它可以触发与这个事件相关的JavaScript对象 ...