Python之路,week03 - Python基础3

本节内容

  1. 函数与函数式编程

  2. 函数式编程之参数详解

  3. 局部变量与全局变量作用域

嵌套函数

  1. 递归

  2. 函数式编程介绍

  3. 高阶函数

  4. 内置函数


1. 函数与函数式编程

1.面向对象:华山派---》类---》class
2.面向过程:少林派---》过程---》def
3.函数式编程:逍遥派---》函数---》def

函数过程区别:

def func1():
#函数print('in the func1')return  0def func2():
#过程print('in the func2')#过程没有返回值
x=func1()
y=func2()print("from func1 return is %s" %x)
print("from func2 return is %s" %y)

为什么要使用函数??

  1. 代码重用
  2. 保持一致
  3. 可扩展性
import timedef logger():time_format = '%Y-%m-%d %X'time_current = time.strftime(time_format)with open('a.txt','a+') as f:f.write('%s end action\n' %time_current)def test1():print('in the test1')logger()def test2():print('in the test2')logger()def test3():print('in the test3')logger()test1()
test2()
test3()

2. 函数式编程之参数详解

函数返回值:

def test1():print("this is test1")def test2():print("this is test2")return 1def test3():print("this is test3")return 0,10,'hello',['alxe','lb'],{'wf':'ss'}x=test1()
y=test2()
z=test3()
print(x)
print(y)
print(z)

总结:
返回值数=0,返回None
返回值数=1,返回object
返回值数>1,返回tuple(元组)

参数:
1.形参和实参
2.位置参数和关键字
标准调用-实参与形参位置一一对应
关键字调用-位置无需固定
3.默认参数
4.参数组

#*args:接受N个位置参数,转换为元组的方式
def test(*args):print(args)test(1,2,4,5,6)
test(*[1,2,3])  # args=tuple([1,2,3])#和其他参数一起使用,实现可扩展的功能
def test1(x,*args):print(x)print(args)test1(1,2,3,4,5)#**kwargs:接受N个关键字参数,转换成字典的方式
def test2(**kwargs):print(kwargs)test2(name='alex',age=8,sex='F')
test2(**{'name':'alex','age':8,'sex':'F'})#和其他参数一起使用,实现可扩展的功能
def test3(name,**kwargs):print(name)print(kwargs)test3('alex',age=8,sex='F')

3. 局部变量与全局变量作用域

school = "Oldboy edu."
def change_name(name):global school#如果需要修改全局变量,需要先申明print("before change,name:%s,school:%s" %(name,school))name="Alex Li"  #这里是局部变量,这个函数就是这个函数的作用域school = "Mage Linux"print("after change,name:%s,school:%s" %(name,school))name = "alex"
change_name(name)
print("name:",name)
print("school:",school)

ps:稍微复杂的类型,如【列表 字典 集合 类】等都能直接改数据

names = ['Alex','Jack','Rain']def change_name():names[0] = '金角大王'print("inside:",names)
change_name()
print("outside:",names)

全局与局部变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。


4. 递归

`
def calc(n):print(n)if int(n/2) > 0:return calc(int(n/2))print("->",n)calc(10)

递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出
(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)


5. 函数式编程介绍

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

一、定义

简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。

主要思想是把运算过程尽量写成一系列嵌套的函数调用。举例来说,现在有这样一个数学表达式:

  (1 + 2) * 3 - 4

传统的过程式编程,可能这样写:

  var a = 1 + 2;

  var b = a * 3;

  var c = b - 4;

函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:

  var result = subtract(multiply(add(1,2), 3), 4);

这段代码再演进以下,可以变成这样

add(1,2).multiply(3).subtract(4)

这基本就是自然语言的表达了。再看下面的代码,大家应该一眼就能明白它的意思吧:

merge([1,2],[3,4]).sort().search("2")

因此,函数式编程的代码更容易理解。

要想学好函数式编程,不要玩py,玩Erlang,Haskell, 好了,我只会这么多了。。。


6. 高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def add(a,b,f):return f(a)+f(b)res = add(3,-6,abs)
print(res)

**程序练习  
程序1: 实现简单的shell sed替换功能

程序2:修改haproxy配置文件

需求:**

1、查输入:www.oldboy.org获取当前backend下的所有记录2、新建输入:arg = {'bakend': 'www.oldboy.org','record':{'server': '100.1.7.9','weight': 20,'maxconn': 30}}3、删除输入:arg = {'bakend': 'www.oldboy.org','record':{'server': '100.1.7.9','weight': 20,'maxconn': 30}}
global       log 127.0.0.1 local2daemonmaxconn 256log 127.0.0.1 local2 info defaultslog globalmode httptimeout connect 5000mstimeout client 50000mstimeout server 50000msoption  dontlognulllisten stats :8888stats enablestats uri       /adminstats auth      admin:1234frontend oldboy.orgbind 0.0.0.0:80option httplogoption httpcloseoption  forwardforlog globalacl www hdr_reg(host) -i www.oldboy.orguse_backend www.oldboy.org if wwwbackend www.oldboy.orgserver 100.1.7.9 100.1.7.9 weight 20 maxconn 3000原配置文件

转载于:https://www.cnblogs.com/lemonT/p/7471761.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

循环链表、双链表

文章目录循环链表、双链表双链表插入删除单循环链表双循环链表习题线性表实现方法比较循环链表、双链表 双链表 插入 删除 单循环链表 双循环链表 习题 线性表实现方法比较

[芦半山]Binder的异常机制

文中代码分析基于Android 10.0 (Q)两个进程之间若是要进行Binder通信,那么发起通信的一端我们就称它为Client进程。Client进程调用每一个代理对象的方法,本质上都是一次跨进程通信。如果这个方法是同步方法(非oneway修饰)&#xf…

bufg和bufgp_如何将自己写的verilog模块封装成IP核(一)

平台与材料一个写好的工程,综合通过,不用布局布线,ISE或Vivado皆可。如果是ISE,需要在properties里取消选中 iobuf 。这样就只能被当做内部模块调用了。Vivado步骤打开Vivado,创建一个工程Tools -> Create or packa…

消息中间件核心实体(1)

接上一篇《消息中间件核心实体(0)》,这一篇继续介绍消息中间件中的一些实体。 上一篇主要是Message、Topic、TopicMeta和Queue这样最基础的实体,这几篇介绍一些发送和消费的过程中会涉及到的实体和组件。 1. 发送 1.1 增强Message属性 Message一般只包含…

sklearn(2

算法库顶层设计 SKLEARN监督学习模块 近邻算法 neighbors支持向量机SVM岭回归 kernal_ridge判别分析discriminant_analysis广义线性模型linear_model集成方法ensemble决策树tree朴素贝叶斯naive_bayes交叉分解cross_decompostition高斯过程gaussian_process多层神经网络neural…

sox处理mp3_SoX 音频处理工具使用方法

一、简介SoX 可以读取和写入常见格式的音频文件,并在此过程中选择性的加入一些声音效果。它可以组合多个输入源及合成音效,在许多系统上也可以作为音频播放器或多轨录音机使用。SoX 工具在大部分 Linux 系统上都可以直接通过软件包管理器安装(如sudo apt…

该死的装修

周末了,没有写技术文~因为最近的新房子需要装修,谈了几个装修公司,不知道为什么,我对装修这个事情非常抵触,繁琐的事情太多了,还没有装修,我就觉得有很多事情要斗争。因为家里有小孩&#xff0c…

SKLEARN模型选择

数据集划分方法 K折交叉验证法 将全部训练集S分成k个不相交的子集,假设S中的训练样例子数为m,那么每一个子集有m/k个训练样例,相应子集称作{s1,s2……sk}每次从分好的子集里面,拿一个作为测试集,其他k-1作为训练集在k…

SpringBoot(十) :邮件服务

原文出处: 纯洁的微笑 springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了。准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5.3进行开发。 发送邮件应该是网站的必备功能之…

python中order函数_order by排序

作者Toby,持牌照消费金融模型经理,发明国家算法专利,国内最大医药数据中心数据挖掘部门负责人!和重庆儿科医院,中科院教授,赛柏蓝保持慢病数据挖掘项目合作!清华大学,百度,腾讯&…

被该死的Openssl编译嘲讽了一个下午

昨晚比较尴尬,下班的时候已经很晚了,到半路突然想起来没有带钥匙回去,赶紧折返回公司拿钥匙,在已经很晚的路上我们又多花费了20分钟,到家已经挺晚了,具体多少点我都不好意思说,我要是说出来&…

JavaScript中本地对象、内置对象和宿主对象

http://www.jianshu.com/p/a52e6e183427 http://blog.csdn.net/weiyastory/article/details/52837466 http://www.cnblogs.com/qigang/p/3520974.html 在ECMAScript中,所有对象并非同等创建的。 一般来说,可以创建并使用的对象有3种:本地对象…

类的真正形态

类的真正形态 类的关键字 struct在C语言中已经有了自己的定义,必须继续兼容 在C中提供了新的关键字,class用于类定义 class和struct用法是完全相同 struct和class区别 用struct定义时,所有成员默认为public 用class定义时,所…

docker代理设置ssl证书_docker - 设置HTTP/HTTPS 代理

1、设置代理原因因公司安全限制,所有外网需配置代理后才可上网,但是因为宿主机上设置过代理,并未太过多注意此问题,之后run时报如下错误:# docker run hello-worldUnable to find image hello-world:latest locallydoc…

暴力修改SElinux权限

平台版本 SDK版本 版本名称 9.0 28 Pie (Android P) 8.1 27 Oreo(Android O)(奥利奥) 8.0 26 Oreo(Android O)(奥利奥) 7.1 25 Nougat(Android N)(牛轧糖) 7.0 24 Nougat(Android N)(牛轧糖&…

分类器

sklearn分类器性能指标 分类器性能评估指标 只限于二元单元标签分类问题 可用于二元多标签分类问题的评估指标 如何将二元分类指标扩展到多类或多标签问题中去 可用于多类分类问题的评估指标(紫色的可用于多标签问题) accuracy_score准确率 函数计算分类…

Cucumber+Rest Assured快速搭建api自动化测试平台

转载:http://www.jianshu.com/p/6249f9a9e9c4 什么是Cucumber?什么是BDD?这里不细讲,不懂的直接查看官方:https://cucumber.io/  什么是Rest Assured?传送门:https://github.com/rest-assured…

毕业设计论文选题系统系统用例图_基于UML的毕业设计管理系统的分析与设计

基于UML的毕业设计管理系统的分析与设计毕业设计是实现本科教学培养目标的重要环节,从选题到答辩一般需要四至六个月的时间,其间工作量很大,尤其需要保留大量的文件,以便于管理者对毕业设计工作进行监督。传统的、人工的方式管理各…

让这个该死的服务跑起来了~

#前言被该死的Openssl编译嘲讽了一个下午之前的文章说了我的那个编译的问题,这里说下,知识点有点零散,最后的解决也是一个同事提示,感觉也有点奇葩的赶脚。到目前为止,我现在感受到了写文章的好处,昨晚的问…

深度学习概述

深度学习 传统学习与深度学习 深度学习应用特点 深度学习框架比较 Tensorflow 神经元 卷积核 分类 回归 生成