一、函数的定义

def test(x)
"The Function definitions"
x +=
return x

def:定义函数的关键字

test:函数名

():定义形参

“”:文档描述

x += 1:泛指代码块或程序处理逻辑

return:定义返回值(出现return,函数结束)

调用运行时,可带参数也可不带:函数()

优点:代码重用,保持一致性易维护,可扩展性

二、函数和过程

1.过程即没有返回值的函数,由于Python中没有使用return返回值时,会返回None,所以过程在Python中也是函数

2.返回值

def test01():
pass
def test02():
return 0
def test03():
return 0, 10, 'hello', ['kobe', 'lbj'], {'Team': 'lakers'}
t1 = test01()
t2 = test02()
t3 = test03()
print(t1,t2,t3)

返回值数为0,返回None,返回值数为1,返回object,返回值数>1,返回tuple。

三、函数参数

1.形参和实参

def calc(x,y):#x,y为形参
res = x ** y
return res
t = calc(1,2)#1,2为实参
print(t)

  形参只在函数调用时才分配内存单元,调用结束后立即释放,因此形参只在函数内部有效

  实参可以是常量、变量、表达式、函数,在函数调用时,实在必须有确定的值以便把值传给形参

2.位置参数和关键字参数

def test(x,y,z):
print(x,y,z)
test(1,2,3)#位置参数
test(x=1,z=3,y=2)#关键字参数
test(1,y=2,z=3)

  位置参数必须一一对应,不能多或少,关键字参数无须一一对应,也不能多或少,二者可以混用,但位置参数必须在关键字参数左边否则报错。

3.默认参数

def power(x, n=2):#n为默认参数
s = 1
while n > 0:
n = n - 1
s = s * x
print(s)
return(s) power(4,4)

  默认参数可以降低函数调用的难度,但设置的时候要注意,不能用可变对象

def add_end(L=[]):
L.append('END')
return L # print(add_end([123,456]))
print(add_end())
print(add_end())
print(add_end())

4.参数组

def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test(1,2,3,4,5,y=12,z=22)

  *args传的是列表或元组,**kwargs传的是字典

(1)定义可变参数用*

def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
s = calc(1,2,3)
print(s)
num = [1,2,3,4]
s = calc(*num)
print(s)

(2)定义关键字参数用**

def person(name, age, **kw):
print("name:", name, "age:", age, "other:", kw)
person("hechouzi", 25,city="jiangsu",height=183)
extra = {"city":"jiangsu","height":183}
person("heheh",12,**extra)

四、全局变量和局部变量

  全局变量全部大写,局部变量全部小写

  函数中如果没有global参数,且没有声明局部变量,函数内部可以调用全局变量,但不可修改

  函数中如果有global参数,可以对全局变量进行修改

  函数中如果定义了局部变量,则优先读取局部变量

NAME = "KOBE"
def change_name():
global NAME
name = "LBJ"
print("Who am i:",NAME)
print("Who are you:",name)
NAME = "BYRANT"
print("Now,who am i:",NAME)
print("Now,who are you:",name)
change_name()
print(NAME)
print(name)#报错,因为是局部变量

五、前向引用

  “函数即变量”

def test1():
print("from test1")
test2()
def test2():
print("from test2")
test1()

前向引用就是在定义函数之前引用

六、嵌套函数和作用域

def test1():
name = "Jordan" def test2():
name = "Kobe" def test3(): print(name)
return test3 return test2
func = test1
print(func)
func()()()

七、递归调用

1.递归特性

  1.必须有一个明确的结束条件;2.进入深一层的递归,问题规模要比上一层有所减少;3.递归效率不高,递归层次过高会导致栈溢出。

(图侵删)

def calc(n):
if int(n/2)==0:
return n
n = int(n/2)
re = calc(n)
return re
print(calc(100))

2.尾递归优化

  如阶乘函数,当所求阶乘数太大,会导致栈溢出。

def fact(n):
if n == 1:
return n
return n*fact(n-1)
print(fact(100))

  尾调用就是指在一个函数的最后一步调用另外一个函数,以此来实现尾递归优化

def fact(n):
return fact_iter(n,1);
def fact_iter(num,res):
if num == 1:
return res
return fact_iter(num - 1,num*res)
print(fact(5))

  尾调用优化可以不要保存外层函数的调用记录,可以防止栈溢出,但大多数编程语言没有针对尾调用优化,Python也没有。

八、匿名函数

calc = lambda n:n**n
print(calc(10))

  匿名函数lambda主要和其他函数搭配使用

九、函数式编程

1.函数式编程

  函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

函数式编程的一个特点是允许把函数本身作为参数传给另一个函数,还允许返回一个函数,因为Python允许使用变量,所以Python不是纯函数式编程语言。

2.高阶函数

  可以接收另外一个函数做变量的函数

def add(x,y,f):
return (f(x)+f(y))
print(add(-1,6,abs))

  高阶函数满足两个特性:(1)传入参数是一个函数名;(2)返回值是一个函数名

3.map函数和reduce函数

(1)map函数

  接收两个参数,一个是函数,一个是可迭代对象

def f(x):
return x*x
print(list(map(f,[1,2,3,4,5])))
L = []
for i in [1,2,3,4,5]:
L.append(i*i)
print(L)

  相同功能可以用for实现,但map函数把运算规则抽象了,可以计算任意复杂函数。

  map函数结合匿名函数的使用

print(list(map(lambda x:x*x,range(5))))

(2)reduce函数

  把一个函数作用到一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积运算。

from functools import reduce
def f(x,y):
return x*100+y*10
print(reduce(f,[1,2,3,4,5]))

4.filter函数

  与map函数类似,filter函数也要接收一个函数和一个序列,filter函数把传入的函数依次作用于每一个元素,然后根据返回值是True和False来决定保留还是丢弃。

def is_odd(x):
return x % 2 == 1
print(list(filter(is_odd,[1,2,3,4,5,6,7,8])))

十、内置函数

https://docs.python.org/3/library/functions.html?highlight=built#ascii

1.abs()  

  取绝对值

2.all() 

  把所有元素做bool运算,如果都是True则返回True

3.any()  

  把所有元素做bool运算,只要有一个是True就返回True

4.bin()/hex()/oct()

把十进制数转换成二进制/十六进制/八进制数

5.bool()  

  判断bool值

6.bytes()  

  把字符串转换成字节,需指定编码

#bytes()函数
a = bytes('abc', 'utf-8')
print(a)
b = bytes(1)
print(b)
c = bytes([2,3,6,8])
print(c)

7.chr()/ord()  

  chr(),输入ASCII码表中的编号,输出对应字符;ord(),输入字符,显示字符对应的ASCII码表中的编号

8.dir()  

  打印某个对象下的方法

9.divmod()  

  取得商和余数,可以用在分页功能

10.enumerate()  

  遍历序列中的元素及下标

test = [11,22,33,44]
for i,j in enumerate(test):
print(i,j)

11.eval()  

  将字符串str当成有效的表达式来求值并返回计算结果;把字符串中的数据结构提取出来

12.zip()  

  拉链

a = (1,2,3)
b = ("a","b","c")
print(list(zip(a,b))

13.max()/min()  

  求取最大值和最小值

14.pow()  

  输入两个参数是求取次幂,输入三个参数是求次幂后取余

15.reversed()    

  反转

16.round()  

  四舍五入 ,可以指定小数位

17.sorted()  

  排序

18.sum()  

  求和

19.type()  

  查看类型

20.__import__()  

  导入文件

Python开发——5.函数的更多相关文章

  1. 06 python开发之函数

    06 python开发之函数 目录 06 python开发之函数 6 函数 6.1 基本使用 6.1.1 基本概念 6.1.2 定义函数 6.2 调用函数与函数返回值 6.2.1 调用函数三种形式 6 ...

  2. python开发之函数

    转:https://www.tuicool.com/wx/vEVrqeR 06 python开发之函数 博客园精华区12-12 20:56 06 python开发之函数 目录 6.2 调用函数与函数返 ...

  3. python开发_函数的参数传递

    在这个用例中,我们要讨论的是关于函数的传参问题 我所使用的python版本为3.3.2 对于函数: def fun(arg): print(arg) def main(): fun('hello,Ho ...

  4. python开发初识函数:函数定义,返回值,参数

    一,函数的定义 1,函数mylen叫做函数名 #函数名 #必须由字母下划线数字组成,不能是关键字,不能是数字开头 #函数名还是要有一定的意义能够简单说明函数的功能 2,def是关键字 (define) ...

  5. Python全栈开发之路 【第四篇】:Python基础之函数

    本节内容 函数def: 1.位置参数,默认参数 2.位置参数,关键参数 3.如果参数中出现 *users,传递的参数就可以不再是固定的个数, 传过来的所有元素进行打包成元组 *args,**kwarg ...

  6. python函数,模块及eclipse配置python开发环境

    一.eclipse的使用 1.作用 (1)最好用的IDE (2)可调式debug (3)查看可执行过程 (4)可查看源代码 2.安装eclipse及配置 目录安装Pythonpython for ec ...

  7. python全栈开发笔记---------函数

    一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...

  8. python开发_python中的函数定义

    下面是我做的几个用列: #python中的函数定义,使用和传参 def_str = '''\ python中的函数以如下形式声明: def 函数名称([参数1,参数2,参数3......]): 执行语 ...

  9. Python开发【第五篇】:函数

    1. 函数   函数是组织好的,可重复使用的,用来实现单一,或相关功能的代码块.   函数分为 Python 程序内置函数,用户自定义的函数.将代码定义为函数,有如下好处: 代码重用(某个特定功能复用 ...

随机推荐

  1. CSS笔试题

    如何实现移动端9宫格 如何实现移动端下列8宫格 实现移动端图片画廊CSS样式 写一个简单的animation的css动画 美化select,radio,range样式,只需考虑谷歌浏览器,下面给出的是 ...

  2. c# 对DataTable进行分组group by

    ]);//对索引为0的一列进行分组,结果是集合

  3. [java,2017-05-04] 创建word文档

    package test; import java.text.SimpleDateFormat; import java.util.Date; import com.aspose.words.Data ...

  4. C++ #define #if #ifndef 宏指令

    不会用就直接复制粘贴 #define CURSOR(top,bottom) (((top)<<8)|(bottom)) #define mul(x1,x2) (x1*x2) #define ...

  5. JAVA 类的三大特性,封装,继承,多态 的一些发现总结

    < 一 > 封装 < 二 > 继承 1,关于父类中的私有属性和方法,子类能不能访问的问题 1.1,子类不能通过继承拥有父类的私有属性和方法 1.2,子类可以从父类继承下来的 方 ...

  6. <记录> PHP读取命令行参数

    方法一:使用$argv or $argc参数接收 echo "接收到{$argc}个参数"; print_r($argv); [root@DELL113 lee]# /usr/lo ...

  7. LeetCode OJ 129. Sum Root to Leaf Numbers

    题目 Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a num ...

  8. 网站加入QQ在线客服

    <!-- qq客服 --> <div class="QQFloat" > <div class="qq"> <div ...

  9. react-native 新手爬坑经历(Could not connect to development server.)

    来,先说下报错出现场景,刚跑完项目加载完是好的,但是双击R后就开始耍小脾气了-红屏出现,如下图 首先检查包服务器是否运行正常.在项目文件夹下输入react-native start或者npm star ...

  10. windows nodejs yarn 与hadoop yarn命令冲突

    添加环境变量后 修改名字 1.修改前: 2.修改后: