一、函数

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

    特性:

1)代码重用

2)保持一致性

3)可扩展性

参考博客:

Py西游攻关之函数

1、函数参数

形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,目的是在函数调用时接收实参(实参个数,类型应与实参一一对应)

实参:实际参数,调用函数时传给函数的参数,可以是常量,变量,表达式,函数,传给形参

区别:形参是虚拟的,不占用内存空间,.形参变量只有在被调用时才分配内存单元,实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参

  • 关键字参数
  • 默认参数
  • 不定长参数

1)关键字参数:

须以正确的顺序传入函数。调用时的数量必须和声明时的一样。但可以自己指定赋值,这样就可以不管顺序。

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

def f(name,age):
print('I am %s,I am %d'%(name,age)) # f(16,'alvin') #报错
f(age=22,name='perry')

2)缺省参数(默认参数):

默认参数必须跟在非默认参数后面

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的sex,如果sex没有被传入,就打印默认值:

def print_info(name,age,sex='male'):

    print('Name:%s'%name)
print('age:%s'%age)
print('Sex:%s'%sex)
return print_info('alex',18)
print_info('铁锤',40,'female')

3)不定长参数      *args and **kwargs(key-word arguments)

参考:*args and **kwargs

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。

# 不定长参数
def add(*args):
sum=0
for v in args:
sum+=v
return sum print(add(1,4,6,9))
print(add(1,4,6,9,5))

加了星号(*)的变量名会存放所有未命名的变量参数,将传入的参数保存到一个元组中

而加(**)的变量名会存放命名的变量参数,将传入的命名参数放到一个字典dict中

def print_info(name, **kwargs):

    print(kwargs)
for i in kwargs.items(): # i为一个元组
print('{0}:{1}'.format(i[0], i[1])) #根据参数可以打印任意相关信息了 for name, value in kwargs.items():
print('{0}:{1}'.format(name, value)) #根据参数可以打印任意相关信息了
return print_info(name='perry', age=23, sex='male', hobby='girl', nationality='Chinese', ability='Python')
'''output
{'age': 23, 'sex': 'male', 'hobby': 'girl', 'nationality': 'Chinese', 'ability': 'Python'}
age:23
sex:male
hobby:girl
nationality:Chinese
ability:Python
age:23
sex:male
hobby:girl
nationality:Chinese
ability:Python
'''

注意两个参数的位置:先是无命名,后是键值对形式的

def print_info(name,*args,**kwargs):#def print_info(name,**kwargs,*args):报错

    print('Name:%s'%name)

    print('args:',args)
print('kwargs:',kwargs) return print_info('alex',18,hobby='girl',nationality='Chinese',ability='Python')
# print_info(hobby='girl','alex',18,nationality='Chinese',ability='Python') #报错
#print_info('alex',hobby='girl',18,nationality='Chinese',ability='Python') #报错

2、函数返回值

要想获取函数的执行结果,就可以用return语句把结果返回

注意:

  ①  函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束

  ②  如果未在函数中指定return,那这个函数的返回值为None

  ③  return多个对象,解释器会把这多个对象组装成一个元组作为一个一个整体结果输出

def exchange(a, b):
return b,a x = 1
y = 2
print("交换前:")
print('x =',x, '\ny =', y) print("交换后:")
x, y = exchange(x,y)
print('x =',x, '\ny =', y) '''
交换前:
x = 1
y = 2
交换后:
x = 2
y = 1
'''

3、函数的作用域

python中的作用域分4种情况:

  • L: local,局部作用域,即函数中定义的变量;
  • E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
  • G:globa,全局变量,就是模块级别定义的变量;
  • B:built-in,系统固定模块里面的变量,比如int, bytearray等。

搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。

x = int(2.9)  # int built-in

g_count = 0  # global
def outer():
o_count = 1 # enclosing
def inner():
i_count = 2 # local
print(o_count) # print(i_count) 找不到
inner() outer() # print(o_count) #找不到

作用域就牵扯到变量的修改问题:

x=6
def f():
print(x)
x=5
f()
错误的原因在于print(x)时,解释器会在局部作用域找,会找到x=5(函数已经加载到内存),但x使用在声明前了,
所以报错: local variable 'x' referenced before assignment.

1) global关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了,当修改的变量是在全局作用域(global作用域)上的,就要使用global先声明一下,代码如下:

count = 10
def outer():
global count
print(count)
count = 100
print(count)
outer() #
#

2)nonlocal关键字

global关键字声明的变量必须在全局作用域上,不能嵌套作用域上,当要修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量怎么办呢,这时就需要nonlocal关键字了

def outer():
count = 10
def inner():
nonlocal count
count = 20
print(count)
inner()
print(count)
outer() #
#20 

4、高阶函数

高阶函数是至少满足下列一个条件的函数:

1)接受一个或多个函数作为输入

2)输出一个函数

注意理解:

  • 函数名可以进行赋值
  • 函数名是一个变量,可以作为函数参数以及返回值
def f(n):
return n*n def foo(a, b, func):
return func(a) + func(b) # 函数名是一个变量,可以作为函数参数
a = foo(2,3,f)
print(a) # 函数名可以进行赋值
f1 = f
print(id(f1))
print(id(f)) b = foo(4, 5, f1)
print(b) '''output
13
2134235233816
2134235233816
41
'''

函数作为函数返回值

def foo():
x=3
def bar():
return x
return bar print(foo()())

5、递归函数

定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

优点:    是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

递归特性:

1)必须有一个明确的结束条件

2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返     回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)

示例1:阶乘

def factorial(n):
result=n
for i in range(1,n):
result*=i
return result print(factorial(4)) # 递归实现
def recursive(num):
if num == 1:
return 1
return num * recursive(num-1) print(recursive(4))

示例2:斐波那契数列

def fibo(n):
if n <= 2:
return 1
return (fibo(n - 1) + fibo(n - 2)) print(fibo(8))

6、内置函数

  Built-in Functions    
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()  
delattr() hash() memoryview() set()

重要的内置函数:

1)filter(function, sequence)

str = ['a', 'b','c', 'd']

def fun1(s):
if s != 'a':
return s ret = filter(fun1, str) print(list(ret))# ret是一个迭代器对象

对sequence中的item依次执行function(item),将执行结果为True的item做成一个filter object的迭代器返回。可以看作是过滤函数。

2)map(function, sequence)

str = [1, 2,'a', 'b']

def fun2(s):

    return s + "alvin"

ret = map(fun2, str)

print(ret)      #  map object的迭代器
print(list(ret))# ['aalvin', 'balvin', 'calvin', 'dalvin']
对sequence中的item依次执行function(item),将执行结果组成一个map object迭代器返回.
map也支持多个sequence,这就要求function也支持相应数量的参数输入:
ef add(x,y):
return x+y
print (list(map(add, range(10), range(10))))##[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

3) reduce(function, sequence, starting_value)

from functools import reduce

def add1(x, y):
return x + y print(reduce(add1, range(1, 101))) ## 5050 (注:1+2+...+99+100) print(reduce(add1, range(1, 101), 20)) ## 5070 (注:1+2+...+99+100+20)

对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用.

也就是先1+2=3,然后3+3=6,然后6+4=10.。。。

4)lambda

普通函数与匿名函数的对比:

#普通函数
def add(a,b):
return a + b print add(2,3) #匿名函数
add = lambda a,b : a + b
print add(2,3) #========输出===========
5
5

Python3基础笔记--函数的更多相关文章

  1. Python3基础-特别函数(map filter partial reduces sorted)实例学习

    1. 装饰器 关于Python装饰器的讲解,网上一搜有很多资料,有些资料讲的很详细.因此,我不再详述,我会给出一些连接,帮助理解. 探究functools模块wraps装饰器的用途 案例1 impor ...

  2. Python3基础笔记--基础知识

    目录: 一.变量问题 二.运算符总结 三.字符串问题 四.数据结构 五.文件操作 一.变量问题 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.它自始至终都是在内存中活动,只有指明 ...

  3. Python3基础笔记---面向对象

    只是对一些新的知识的记录 1.创建类 class ClassName: <statement-1> . . . <statement-N> 类实例化后,可以使用其属性,实际上, ...

  4. Python3基础笔记--常用模块

    目录: 参考博客:Python 之路 Day5 - 常用模块学习 Py西游攻关之模块 一.time模块 二.random模块 三.os模块 四.sys模块 五.hashlib模块 六.logging模 ...

  5. Python3基础笔记--生成器

    目录: 一.列表生成器 二.生成器 三.迭代器 一.列表生成器 a = [x for x in range(10)] b= [y*2 for y in range(10)] def f(n) retu ...

  6. Python3基础笔记--装饰器

    装饰器是十二分重要的高级函数. 参考博客:装饰器 所需前提知识: 1.作用域: LEGB 2.高阶函数 高阶函数是至少满足下列一个条件的函数: 1)接受一个或多个函数作为输入 2)输出一个函数 注意理 ...

  7. Python3基础笔记_迭代器

    # Python3 迭代器与生成器 import sys ''' 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开 ...

  8. Python3基础笔记_字典

    # Python3 字典 dict = {'} # 1.访问字典里的值 ,字典中没有key会报错 # 2.修改字典 print("修改之前:", dict['Beth']) dic ...

  9. Python3基础笔记_元组

    # Python3 元组 ''' Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运 ...

随机推荐

  1. bzoj1797: [Ahoi2009]Mincut 最小割(最小割+强联通tarjan)

    1797: [Ahoi2009]Mincut 最小割 题目:传送门 题解: 感觉是一道肥肠好的题目. 第二问其实比第一问简单? 用残余网络跑强联通,流量大于0才访问. 那么如果两个点所属的联通分量分别 ...

  2. xBIM 基础05 3D墙案例

    系列目录    [已更新最新开发文章,点击查看详细]  使用编码的形式去生成一堵墙的模型需要做很多的工作. using System; using System.Collections.Generic ...

  3. java类型与Hadoop类型之间的转换

    java基本类型与Hadoop常见基本类型的对照Long LongWritableInteger   IntWritableBoolean   BooleanWritable String Text ...

  4. Re:从 0 开始的微服务架构--(三)微服务架构 API 的开发与治理--转

    原文来自:聊聊架构公众号 前面的文章中有说到微服务的通信方式,Martin Folwer 先生在他对微服务的定义中也提到“每个服务运行在其独立的进程中,服务与服务间采用 轻量级的通信机制 互相协作(通 ...

  5. 让placeholder中的默认文字居中,或者缩进多少像素

    直接给input或者textarea的样式加texta-align:center; <input type="" name="" id="&qu ...

  6. (转载)Android UI设计之AlertDialog弹窗控件

    Android UI设计之AlertDialog弹窗控件 作者:qq_27630169 字体:[增加 减小] 类型:转载 时间:2016-08-18我要评论 这篇文章主要为大家详细介绍了Android ...

  7. 【转载】tom的RUNSTATS测试工具

    -- 创建 runstats 包.其中包括 3 个简单 API 调用: create or replace package runstats_pkg as procedure rs_start; pr ...

  8. ActiveMQ学习笔记(12)----ActiveMQ的集群

    1. Queue consumer cluster ActiveMQ支持Consumer对消息的高可靠性的负载均衡消费,如果一个Consumer死掉,该消息会转发到其他的Consumer消费的Queu ...

  9. 3ds Max做的卡通狗教程

    使用软件::3ds Max 软件下载:http://www.xy3dsmax.com/xiazai.html 全教程完,学完记得交作业.如果本教程对您有所帮助,请推荐给你的朋友.

  10. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...