Python 基础 - Day 3 Learning Note - Function 函数

前言:

编程的三种方式

  1. 面向对象:类 (class) 
  2. 面向对象 : 过程 (def)
  3. 函数式编程: 函数 (def) 

定义:函数 vs. 过程

在python中,函数是对程序逻辑进行结构化或过程化的一种编程方法。 函数式编程就是:先定义一个数学函数, 然后按照这个数学模型用编程语言来实现。 

过程式的编程就是没有返回值的函数式编程。 见下列

def func1():
    'the function discption - define a function'   #文档介绍,强烈推荐解释function的逻辑
    print('in the func1')
    return 0

x=func1()
print('from func1 return is %s' %x)

in the func1
from func1 return is 0

面向过程:定义一个过程,过程就是没有返回值的函数

def func2():
    'define a process'
    print('in the func2')
 #定义一个过程,过程就是没有返回值的函数

y=func2()
print('from func2 return is %s' %y)

in the func2
from func2 return is None

函数的返回值

 
返回的对象的数目python实际返回的对象
0None
1object 
(包括一个list,或者另外一个function)
>1 tuple
  • 设置返回值的原因: 需要函数整个执行的结果,后面的程序需要根据这个执行结果来操作。 

函数的作用:

1、可重复利用 2、使代码保持一致 3、可扩展性

调用函数 - 参数

1. 关键字调用(与形参顺序无关)及 标准位置调用 (与形参一一对应):关键参数不能写在位置参数前面,混合使用时以位置调用为主

def test(x,y):  # 形式参数,是虚拟变量。
    print(x)
    print(y)

test(1,2)  # 标准位置调用方法
test(y=3,x=2) # 关键字调用

2. 默认参数: 调用函数市,默认函数可有可无,非必传。 用途主要在于默认安装值,联系数据库的端口号。

3. 参数组:通过一个元组*(非关键字参数)或字典**(关键字参数)作为参数组传递给函数。参数组一定要放最后。

def func(*args):
    print(args)

func(1,3,4,3,67)
func(*[1,3,4,3,67]) 

(1, 3, 4, 3, 67)

(1, 3, 4, 3, 67)

def func1(**kwargs):
    print(kwargs)

func1(name='alex',age='8',sex='F')  #必须以关键字参数的方式

 {'name': 'alex', 'age': '8', 'sex': 'F'}

参数传递

python中, 变量是没有类型,仅仅是对象的引用,可以是string或者list或者tuple等。

对象分类  数据类型解释参数的传递
不可更改类型 string, number, tuple变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身
可更改类型list,dictionary  变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

 

变量的作用域

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

递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。递归的特性
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
* 堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html 
 
def calc(n):
    print(n)
    if int(n/2) >0:
        return calc(int(n/2))
    print("->",n)

calc(10)   # 递归的次数最高为999次

 

 

函数式编程

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

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

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。函数式编程语言有erlang,hashhell等。lambda表达式和其他四种内建函数。 (待补充)

  • 匿名函数与lambda
  • 内建函数 - apply()
  • 内建函数 - filter()
  • 内建函数 - map()
  • 内建函数 - reduce()

 

高阶函数

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

 

转载于:https://www.cnblogs.com/lg100lg100/p/7096360.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值