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 # # 不光可以传递变量,还 ...
随机推荐
- JS获取坐标
1.js获取对象的绝对坐标 方法1: function getAbsPoint(e) { var x = e.offsetLeft, y = e.offsetTop; while(e=e.offset ...
- [VC6,VC9] [ts,nts,deb] [rpm,msi] 你需要下载什么格式的文件
1.VC6与VC9的区别 VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本. VC9版本是使用Visual Studio 200 ...
- JS和AS交互
这个话题在网上应该说很好找,有很多这方面的资料.比者也看过一些,不过大部分都是AS2与JS进行交互.很少提到AS3,即使有,也让人感觉浅尝辄止.很多东西并没有介绍的太清楚.所有笔者萌生了写这样一篇教程 ...
- 开启和关闭HBase的thrift进程
开启 $HBASE_HOME/bin/hbase-daemon.sh start thrift [hadoop@bigdatamaster hbase]$ jps 3543 ThriftServer ...
- vagrant在windows下的安装和配置
记录一下安装和配置过程中的一些坑步骤一分别下载vagrant和VirtualBox,我这里下载的是vagrant_1.9.1.msi 和 VirtualBox-5.1.14-112924-Win.ex ...
- 【Spring学习笔记-2.1】Spring的设值注入和构造注入
设值注入: 先通过无参数的构造函数创建一个Bean实例,然后调用对应的setter方法注入依赖关系: 配置文件: <?xml version="1.0" encoding=& ...
- nump库的简单函数介绍
1:ones函数(百度知道) ones()函数用以创建指定形状和类型的数组,默认情况下返回的类型是float64.但是,如果使用ones()函数时指定了数据类型,那么返回的就是该类型. 参考NumPy ...
- JDK类集框架实验(ArrayList,LinkedList,TreeSet,HashSet,TreeMap,HashMap)
ArrayList import java.util.ArrayList; public class C8_3 { public static void main(String[] args) ...
- 安卓权威编程指南 - 第五章学习笔记(两个Activity)
学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...
- win7 没有权限使用网络资源
局域网下同一工作组电脑无法访问 提示"....没有权限使用网络资源...." 一.组策略 win + R 输入gpedit.msc并回车,打开本地组策略编辑器 按如下展开 计算机配 ...