Python学习笔记_week3_函数
一、介绍
1、面向对象(华山派)--->类(独门秘籍)--->class(定义的关键字)
2、面向过程(少林派)--->过程--->def
3、函数式编程(逍遥派)--->函数--->def
二、函数的定义:
1、初中数学:y=2x+3
2、编程语言中的函数定义:函数是逻辑结构化和过程化的一种编程方法。
def test(x):
"The function definitions"
x+=1
return x
def :定义函数的关键字
test:函数名
():内可定义形参
"":文档描述(非必要,但强烈建议写上)
x+=1:泛指代码块或程序处理逻辑
return:定义返回值
define_
#函数
def func1():
'''testing1'''
print('in the func1')
return 0 #过程(没有返回值的函数,但python中隐式的返回None,所以python中区别不大了)
def func2():
'''testing2'''
print('in the func2') x=func1()
y=func2()
print(x,y)
define_test1
当一个函数\过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,所以在python中即便是过程也可以算作函数。
函数式编程:先定义一个数学函数,然后按照这个数学模型用编程语言去实现它。
三、为什么要用函数
没有函数的编程只是在写一个逻辑(功能),想脱离函数,重用逻辑,唯一的方法就是拷贝。
函数的三大优点:
1、代码重用
2、保持一致性
3、可扩展性
import time
def 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()
func_test2
四、函数返回值
为什么要有返回值:我想要整个函数执行的结果
返回值数=0:返回None
返回值数=1:返回object
返回值>1:返回tuple
'''def test1():
print('in the test1')
return 0
# print("test end") # 碰到return,终止程序运行返回0,所以不会被打印
x=test1()
print(x)''' def test1():
print('in the test1')
def test2():
print('in the test2')
return 0
def test3():
print('in the test3')
return 1,'hello',['alex','wupeiqi'],{'name':'alex'}
x=test1()
y=test2()
z=test3()
print(x)
print(y)
print(z) #放到一个元组里返回
func_test3
五、函数调用
test()执行,()表示调用函数test,()内可以有参数也可以没有
参数:
1、形参和和实参。形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,目的是在函数调用时接受实参(实参个数,类型应与实参一一对应);
实参:实际参数,调用函数时传给函数参数,可以是常量、变量、表达式、函数,传给形参。
区别:形参是虚拟的,不占用内存空间,形参变量只有在被调用时才分配内存单元,实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参。
2、位置参数和关键字
3、默认参数。特点:调用函数时候,默认参数非必须传递
用途:1、默认安装值;2、默认端口号
4、参数组。*args,**kwargs
def test(x,y):
print(x)
print(y)
test(1,2) #与形参一一对应,位置参数调用
test(y=1,x=2) #与形参顺序无关,关键字调用
# test(3,x=1) 报错,多个值给x
# test(x=2,3) #报错,关键参数不能写在位置参数之前
func_test4
def test(x,y=2):
print(x)
print(y)
test(1) #默认参数,不赋值就是2,赋值就为赋的值 def test(x,soft1=True,soft2=True):#默认安装值
pass
def conn(host,port=3306):#默认端口号
pass
func_test5
def test(*args): #接受N个位置参数,转化成元组的形式
print(args)
test(1,2,3,4,5,6) # 参数组,实参数目不固定,形参用*定义 test(*[1,2,3,4,5,6]) # args=tuple[1,2,3,4,5,6] def test1(x,*args):
print(x)
print(args)
test1(1,2,3,4,5,6,7) #与位置参数结合起来 def test2(**kwargs): # **kwrgs,接受n个关键字参数,转换成字典的方式
print(kwargs)
print(kwargs["name"])
print(kwargs["age"])
print(kwargs["sex"])
test2(name="alex",age=8,sex='F')
# test2(**{"name":"alex","age":8}) def test3(name,**kwargs):
print(name)
print(kwargs)
test3("alex",age=18,sex='m') def test4(name,age=18,**kwargs): #参数组往后放
print(name)
print(age)
print(kwargs)
test4("alex",sex='m',hobby="tesla",age=3) def test5(name,age=18,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs)
test5("alex", age=34,sex='m',hobby="tesla")
func_test6
def logger(source):
print("from %s" % source)
def test5(name,age=18,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs)
logger("TEST5")
test5("alex", age=34,sex='m',hobby="tesla")
六、全局与局部变量
'''school="Oldboy edu." #全局变量
def change_name(name):
global school
school="Mage Linux"
print("before change",name,school)
name="Alex li" #这个函数就是这个变量的作用域,这个变量只在这个函数里生效。局部变量。
age=23
print("after change",name)
name="alex"
change_name(name)
print(name)
print(school)''' '''def change_name():
global name # 别用!用了就被开除
name="alex"
change_name()
print(name)''' school="Oldboy edu"
names=["Alex","Jack","Rain"]
def change_name():
names[0]="jinjiaodawang" #除了简单的字符串和整数不能改,其他列表,字典等都可以改
print(names)
change_name()
print(names)
jububianliang
七、递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
# def calc(n):
# print(n)
# return calc(n+1)
# calc(0) #递归999次,栈溢出,报错 def calc(n):
print(n)
if int(n/2) >0:
return calc(int(n/2))
print("-->",n)
calc(10)
duigui_
八、函数式编程介绍
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。Haskell、Erlang等是函数式编程语言(纯函数式编程,想学别在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, 好了,我只会这么多了。。。
九、高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def add(a,b,f):
return f(a)+f(b)
res=add(3,-6,abs)
print(res)
gaojie_func
Python学习笔记_week3_函数的更多相关文章
- Python学习笔记之函数
这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...
- 小甲鱼:Python学习笔记003_函数
>>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") ...
- Python学习笔记 - day6 - 函数
函数 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多次执行(这叫函数的调用).函数在编程语言中有基本分为:预 ...
- Python学习笔记系列——函数
今年下半年的计划主要是Python和Mysql了,公司不方便看书和视频,就照着廖雪峰的Python网站开始看了.以下纯为个人笔记记录,若是想系统学习的小伙伴还是看这里的好一些,毕竟系统.https:/ ...
- Python学习笔记(五)函数和代码复用
函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print().同样,你也可以自己创建函数, ...
- python学习笔记(4)--函数
1.函数 函数是指将一组语句的集合通过一个名字封装起来.要想执行这个函数,只需调用其函数名即可. 函数的特性: 1.减少重复代码 2.使程序变的课扩展 3.使程序变得易维护 语法定义: def pri ...
- Python学习笔记-Day3-python函数
1.为什么要用函数? 提高代码重复利用率,减少代码冗余.封装模块化代码,便于调用 2.函数声明定义(注意:函数先声明后调用) 注意:函数的reture循环中的exit功能一样(函数不执行,终止) 函数 ...
- Python学习笔记11—函数
建立第一个函数 /usr/bin/env Python #coding:utf-8 def add_function(a,b): c = a+b print c if __name__==" ...
- Python学习笔记7-把函数当参数传递、指定可变参数
把函数当参数传递 # 函数参数传递 # 面向对象编程就是把对象传来传去 # 面向函数编程就是把函数传来传去 def mytest(num): return num * 2 # # 不光可以传递变量,还 ...
随机推荐
- 黄聪:wordpress如何获取访问的网站的cookie值
$head = wp_get_http_headers( $word_url ); $cookie = $head['set-cookie']; $cookie = substr( $cookie, ...
- VBScript Scripting Techniques: File Open Dialog http://www.robvanderwoude.com/vbstech_ui_fileopen.php
I accept cookies This website uses cookies to ensure you get the best experience on our website More ...
- Mina 专题
未完待续>>> 目录: 一)同步.异步.阻塞.非阻塞 二)Java中的NIO 三)Mina 异步请求 四)Mina 同步请求 五)Mina 核心类及处理流程 六)Mina 线程模型 ...
- P2837晚餐队列安排
传送 特写此篇,纪念不用dp做dp题 洛谷说这是个dp,但我不信(其实就是不会dp),因此我们考虑用另一种思路.修改后的队列每一个 数a[i]一定满足a[i]<=a[i+1],那修改后的顺序就是 ...
- Dubbo(6)Dubbo服务集群实现负载均衡
什么时候用到集群?比如说某个服务,并发量特别大的时候就会用到集群: 具体的话比如说,某些特殊的项目一天的注册量10万,国家的一些考试系统,集中在几天,注册量一天10万,如果只弄一个服务,根本服务不过来 ...
- acl的基本知识点
#ACL acl number 3001 rule 1 deny udp destination-port eq 445 rule 2 deny tcp destination-por ...
- [UE4]Uniform Grid Panel
Uniform Grid Panel:统一大小网格 一.如果不设置子控件的Row和Column值,就跟Overlay容器一样的重叠. 二.选中Uniform Grid Panel,可以设置其内的子控件 ...
- [UE4]工程设置:自动捕获鼠标、通过代码设置鼠标显示隐藏、输入模式、编译时自动保存
一.在4.20版本中运行游戏,在没有进行任何设置的情况下,游戏不会自动捕获鼠标,游戏不会接受输入,需要手动点一下游戏界面才行.如果要跟老版本一样运行游戏自动捕获鼠标,需要进行设置 二.也可以通过代码的 ...
- 3-自己动手写HashMap 增加哈希算法
public class HashMap { //存储元素数组 private Entry[] entry = null; //记录map个数 private int size; //构造器 publ ...
- Cloudera HUE大数据可视化分析
下载版本 cdh版本 http://archive-primary.cloudera.com/cdh5/cdh/5/ 我们下载这个 这个是我下载好的 我们解压一下 下载需要的系统包 yum insta ...