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 # # 不光可以传递变量,还 ...
随机推荐
- XE5 Android 开发实现手机打电话和发短信 [转]
其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent ...
- ubuntu-docker入门到放弃(二)docker初探(基本用法及命令)
一.使用公共镜像 docker有一个开源的镜像管理系统,上面有很多常见的images,如mysql,nginx,tomcat等,可以直接根据自己的需求下载下来用,还有系统images,如redhat, ...
- 【巷子】---flux---【react】
一.什么是Flux Flux 是一种架构思想,专门解决软件的结构问题.它跟MVC 架构是同一类东西,但是更加简单和清晰. 二.flux的基本概念 (1) .Flux由4部分组成 1.View:视图层 ...
- Java第07次实验提纲(异常)
PTA与参考资料 题集:集合 异常实验文件 第1次实验 1.1 7-1 常用异常 如何进行强制转换.父类型转化为子类型常见错误. 如何捕获多种类型的异常 简要输出异常信息,System.out.pri ...
- export,import 的用法
摘自https://blog.csdn.net/pcaxb/article/details/53670097: 谢谢!
- slot内容分发
vue实现了一套内容分发的API,这套API基于当前的web components规范草案,将<slot>元素作为承载分发内容的出口. 在前面的父子组件中,我们提到过,在vue中,组件实例 ...
- eKingCloud 从 OpenStack 到 OpenInfra 演进之路
本内容首发于 2016/06/21 北京 OpenInfra 大会上本人的演讲 发文章要求至少150个字,那就把最后一页说明一下吧. 我前面介绍了我们的5大产品,包括企业的私有云架构和实践,包括企业数 ...
- 廖雪峰Java1-2程序基础-9数组
数组初识 1.数组的特点: 数组所有元素初始化默认值,int默认值为0 数组创建后大小不可改变 数组索引从0开始 数组是引用类型 使用索引下标访问数组元素,索引超出范围会报错 2.数组的定义: 类型[ ...
- PyCharm的一些设置
设置使用UTF-8 在任何情况下: 设置写python脚本,新建 脚本的时候默认加的头文件. # !/usr/bin/env python# -*- coding:utf-8 -*-# Author: ...
- [UE4]区分队友
一.就算角色死亡也应该是能区分属于哪个队伍,因此在ShooterPlayerState中添加一个变量Side(并设置为可复制),用来记录所属队伍. 并且在Begin Play事件中随机分配队伍 二.在 ...