Python入门篇(六)之函数

1、函数

1.1、编程的方式:

(1)面向对象 -->华山派  -->独门秘籍:类   -->定义关键字:class
(2)面向过程 -->少林派  -->独门秘籍:过程  -->定义关键字:def
(3)函数式编程    -->逍遥派  -->独门秘籍:函数  -->定义关键字:def

1.2、函数是什么?

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

2.3、函数语法定义:

函数语法:
def 函数名(参数1,参数2,参数3,...):
    ‘‘‘注释‘‘‘
    函数体
    return 返回的值

python演示:
def auth(user,password):
    ‘‘‘
        auth function
        :param user: 用户名
        :param password: 密码
        :return: 认证结果
    ‘‘‘
    if user == ‘kim‘ and password == ‘123‘:
        return 0
    else:
        return 1
user = input("用户名:").strip()
pwd = input("密码:").strip()
res=auth(user,pwd)
print(res)

执行结果:
用户名:kim
密码:123
0

2.4、函数返回值

无return->None
return 1个值->返回1个值
return 逗号分隔多个值->元组
要想获取函数的执行结果,就可以用return语句把结果返回

注意:

函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
如果未在函数中指定return,那这个函数的返回值为None

什么时候该有返回值?
    调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
    通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有返回值?
    调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
    通常无参函数不需要有返回值

2.5、函数的参数

形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,目的是在函数调用时接收实参(实参个数,类型应该与形参一一对应)
实参:实际参数,调用函数时传给函数的参数,可以是变量,常量,表达式,函数,传给形参。
区别:形参是虚拟的,不占用内存空间,形参变量只有在被调用时才分配内存单元,实参是一个变量,占用内存空间,数据单向传送,实参传给形参,不能形参传给实参。

★★★★★关键参数是不能写在位置参数前面的!!!!!!

def test1(x,y):
    print(x,y)
test1(1,2)-->位置调用,和形参一一对应
test1(x=1,y=2)-->关键字调用,与形参顺序无关

****************************************
默认参数:
def test1(x,y=2): -->y有默认值为2
    print(x,y)
test1(1,3)

默认参数特点:调用参数的时候,默认参数非必须传递
默认参数用途:默认安装值,端口等

参数组:
*args-->接收多个参数,以元组的方式进行存储
**kwargs-->接受N个关键字参数,以字典的方式进行存储

2.6、总结:

#1、位置参数:按照从左到右的顺序定义的参数
        位置形参:必选参数
        位置实参:按照位置给形参传值

def test1(x,y):
    print(x,y)
test1(1,2) #位置参数
test1(x=4,y=6) #关键字参数
执行结果:
1 2
4 6

#2、关键字参数:按照key=value的形式定义的实参
        无需按照位置为形参传值
        注意的问题:
                1. 关键字实参必须在位置实参右面
                2. 对同一个形参不能重复传值
#3、默认参数:形参在定义时就已经为其赋值
        可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
        注意的问题:
                1. 只在定义时赋值一次
                2. 默认参数的定义应该在位置形参右面
                3. 默认参数通常应该定义成不可变类型

def test2(x,y=3): #默认参数y的值为3
    print(x,y)
test2(2)
test2(2,6)
执行结果:
2 3
2 6

#4、可变长参数(*args,**kwargs):
        可变长指的是实参值的个数不固定
        而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它

def test3(*args): #可变长参数,使用*args接收N个位置参数,并且以元组的方式存储
    print(args)
test3(1,2,3,4,5,6)
执行结果:(1, 2, 3, 4, 5, 6)

def test4(name,*args): #可变长参数和位置参数混合使用
    print(name,args)
test4(‘alex‘,4,5,6)
test4(1,*[1,2,3])
执行结果:
alex (4, 5, 6)
1 (1, 2, 3)

def test5(x,y,**kwargs): #**kwargs接受N个关键字参数,以字典的方式进行存储
    print(x,y)
    print(kwargs)
test5(1,2,c=3,d=4,e=5)
test5(1,y=2,**{‘a‘:1,‘b‘:2,‘c‘:3})
执行结果:
1 2
{‘d‘: 4, ‘e‘: 5, ‘c‘: 3}
1 2
{‘a‘: 1, ‘b‘: 2, ‘c‘: 3}

def test6(*args,**kwargs):
    print(args)
    print(kwargs)
test6(5,6,7,a=1,b=5) #位置参数必须在关键参数的前面,否则会报错
执行结果:
(5, 6, 7)
{‘a‘: 1, ‘b‘: 5}

3、全局与局部变量

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

school="oldboy" --->全局变量school
def change_name(name):
    #global school -->强制修改全局变量,需要进行申明:global 变量名,最好别用此方法
    school="MaGe linux"
    print("before change:",name,school)
    name="Alex li" #局部变量,只在函数体内生效,这个函数就是此变量的作用域
    print("after change:",name)

name="alex"
change_name(name)
print(name)
print(school)
执行结果:
before change: alex MaGe linux
after change: Alex li
alex
oldboy

★★注意:在列表,字典,集合,类等特殊类型变量在函数体内是可以进行修改的,如下演示:
names = ["Alex","Jack","Rain"]
def change_name():
    names[0] = "哈哈"
    print("inside :",names)
change_name()
print(names)
执行结果:
inside : [‘哈哈‘, ‘Jack‘, ‘Rain‘]
outside : [‘哈哈‘, ‘Jack‘, ‘Rain‘]

4、函数递归

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

def calc(n):
    print(n)
    if int(n / 2) == 0:
        return n
    return calc(int(n / 2))
calc(10)
执行结果:
10
5
2
1

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")

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

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

def add(x,y,f):
    return f(x)+f(y)
res = add(3,-6,abs)  #abs本身为一个函数,取绝对值
print(res)
执行结果:
9

6、函数练习:

1、写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作

2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
def count(msg):
    res={
        ‘num‘:0,
        ‘string‘:0,
        ‘space‘:0,
        ‘other‘:0
    }
    for s in msg:
        if s.isdigit():
            res[‘num‘]+=1
        elif s.isalpha():
            res[‘string‘]+=1
        elif s.isspace():
            res[‘space‘]+=1
        else:
            res[‘other‘]+=1
    return res
res=count(‘hello world ! 123‘)
print(res)

3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。

4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
def check_list(msg):
    while type(msg) == list:
        if len(msg) >2:
            msg=msg[0:2]
        return msg
print(check_list([1,2,3,4,5,6,7]))

5、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
def check_list2(seq):
    seq=seq[::2]---------->从头遍历到尾,步长为2
    return seq
print(check_list2([1,2,3,4,5]))

6、写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
方法一:
def check_dict(seq):
    d={}
    for k, v in seq.items():
        if len(v) > 2:
            d[k] = v[0:2]
    return d
print(check_dict({‘k1‘:‘abcdef‘,‘k2‘:[1,2,3,4],‘k3‘:(‘a‘,‘b‘,‘c‘)}))
执行结果:
{‘k2‘: [1, 2], ‘k1‘: ‘ab‘, ‘k3‘: (‘a‘, ‘b‘)}

方法二:
def check_dict(seq):
    d={}
    for i in seq:
        if len(seq[i]) > 2:
            d[i] = seq[i][0:2]
    return d
print(check_dict({‘k1‘:‘abcdef‘,‘k2‘:[1,2,3,4],‘k3‘:(‘a‘,‘b‘,‘c‘)}))
执行结果:
{‘k2‘: [1, 2], ‘k1‘: ‘ab‘, ‘k3‘: (‘a‘, ‘b‘)}

原文地址:http://blog.51cto.com/jinlong/2083159

时间: 2024-10-11 05:25:44

Python入门篇(六)之函数的相关文章

Python入门篇之列表

一.声明 本教程所使用的是Python版本是3.4.2. 二.Python列表介绍 Python列表(List)使用简单而且功能强大,其具有很好的可伸缩性,为开发者编程提供了巨大的便利. [列表变量声明] 列表变量的声明和C语言中声明数组的方式差不多.下图中声明了一个名为 list 的列表变量. [列表元素的索引方式] 笔者在<Python入门篇之字符串使用>一文中介绍过字符串中字符的索引方式.列表元素的索引方式和字符串字符的索引方式是一样的,都是根据元素间隙位置来切割出元素内容.下面做详细说

Python基础篇(六)

retun空值,后面的语句将不再被执行 >>> def test(): ...    print("just a test!") ...    return ...    print("will not be print") ... >>> test() just a test! 和Java类似,在传递参数时,当参数是字符串,元组时,传递的其实是拷贝,修改实际参数不会影响到形式参数.当参数是对象时,修改实际参数将会影响到形式参数.

python入门(六)装饰器的理解

装饰器用于拓展原有函数功能的一种函数比如: def helloWorld(fun) def out() print ("======start========") fun() print ("=====end======") return out @helloWorld def back () print ("let's go") back() 运行结果: ======start======== let's go =====end====== b

【SSRS】入门篇(六) -- 分组和总计

原文:[SSRS]入门篇(六) -- 分组和总计 通过[SSRS]入门篇(五) -- 设置报表格式的设计,一份简单格式的报表已产生,如下图: 这节来说说分组和总计: 根据日期.订单对数据进行分组 添加订单总计 添加每日总计 添加总计 对数据进行分组: 1.单击"设计"选项页.(如果看不到"行组.列组"窗格,右键单击设计图画,选择"视图 -> 分组".) 2.从"报表数据"窗格把"Date"字段拖放到&

python入门学习:7.函数

python入门学习:7.函数 关键点:函数 7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中 7.1 定义函数 ??使用关键字def告诉python要定义一个函数,紧接着跟着函数名,冒号.后面的缩进构成函数体.例如: 1def func_name():2    函数体34def greet_user():5    """显示简单问候语"""6    print("hel

python入门(六):函数

1.系统自带的函数: >>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'Conn

Swift入门篇-闭包和函数

今天主要是给大家分享的是 swift中闭包的用法,我个人觉得闭包就是函数的简写方法,如果您函数不是很熟悉请查阅 swift入门篇-函数 1:函数类型 函数类型 var 变量 :(类型)->返回值 =函数名 说明: 1:函数名 表示函数地址 2:(类型)->返回值 表示函数类型 3:函数类型必须和函数名的参数和返回值一致 例子 /* 1:func 是函数关键字 2:Say是函数名,表示函数的地址 3:Say函数 参数是整形 返回值为布尔类型 */ func Say(num:Int)->Bo

Python入门篇(一)

一.Python入门 python学习博客:http://www.cnblogs.com/haiyan123/p/8387770.html#lable1http://www.cnblogs.com/alex3714http://www.cnblogs.com/linhaifeng/p/7278389.htmlhttps://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 1.Python简介

Python 入门(七)函数

什么是函数 我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = 73.1 s1 = 3.14 * r1 * r1 s2 = 3.14 * r2 * r2 s3 = 3.14 * r3 * r3 当代码出现有规律的重复的时候,你就需要当心了,每次写3.14 * x * x不仅很麻烦,而且,如果要把3.14改成3.14159265359的时候,得全部替换. 有了函