Function

函数是一段组织好的能够实现特定功能或者逻辑的代码块,函数代码在文件执行时读入内存并不执行,在调用函数时执行,简单来说是把一段代码封装给一个函数名(可以用变量的概念去理解,即把一段代码赋值给一个函数名),当使用函数名加执行标记时才运行这段内存中的代码.函数的作用可以减少重复代码,在不同的地方要使用相同的代码块,我们就可以把这段代码封装成函数.同时当多处相同的代码需要修改时,只需要修改函数定义时一处即可扩展性好.

#定义函数
def func_name(parameters):
name = parameters
print('exec code with %s' %name)
return 'some code'
#函数的调用
func_name('sylar')
a = func_name()
print(a)

参数

函数在定义和调用的时候是可以传入参数,在定义时申明的参数称为形参,在函数调用时传入的参数称为实参.一般来说形参只在函数内生效,但是当传入的是list(列表),dict(字典),func(函数)由于这些复杂数据类型传入是对象的内存地址,所以在函数内做了修改,在函数外也会产生响应的修改.因此参数可以分为可变参数和不可变参数.但我们通常在使用中一般将函数的参数使用传入的方式来分类:

  • 位置参数

    根据定义函数时的形参位置一一对应的传入参数,形参和实参顺序必须一致.
def fun1(name, age, post):
print('My name is %s' % name)
print('At the age of %s' % age)
print('The position is %s' % post) fun1('sylar',18,'IT')
  • 关键字参数

    使用形参的关键字确定传入实参的值,此时不需要关注参数的顺序
def fun1(name, age, post):
print('My name is %s' % name)
print('At the age of %s' % age)
print('The position is %s' % post) fun1(name='sylar',post='IT',age=18,)
fun1('tom',post='IT',age=19,)

关键字参数和位置参数的方式可以混用,但是记住不能在关键字参数前传入位置参数

#错误的调用
fun1(name='sylar',age=18,'IT')
  • 默认参数

    在定义形参的时候,给参数设置一个默认值.在调用函数时不传入这个参数就使用默认值.
def fun1(name, age, post='IT'):
print('My name is %s' % name)
print('At the age of %s' % age)
print('The position is %s' % post) fun1(name='sylar',age=18)

默认参数也可以和其它参数混搭使用,但是默认参数只能定义在所有参数的尾部.传入参数的时候只需要遵循放在位置参数之后传入

#错误的定义
def fun1(post='IT',name, age):
  • 不定长参数

    在定义一个函数时,会出现我们并不知道我们使用函数时会传入多少个参数的情况,这时候就可以使用不定长参数.使用*args和**kwargs
#*args会将收到的参数组合为一个元组
def fun1(name,age,*args,):
print('My name is %s' % name)
print('At the age of %s' % age)
print(args)
hope_list= ','.join(args)
print('He hopes list is:%s'%hope_list)
fun1('sylar',18,'IT','travel','movie')
#kwargs会将传入的参数组合为字典,在函数内调用需要函数内代码去获取字典的key才可以取到对应的值
def fun2(**kwargs):
print(kwargs)
name = kwargs['name']
age = kwargs['age']
print('My name is %s' % name)
print('At the age of %s' % age)
fun2(name='sylar',age=18)

局部变量和全局变量

首先需要理解名称空间和作用域,名称空间是指对某段代码进行命名的操作,例如变量名,函数名.全局变量是在整个文件顶部定义,对整个文件都生效.局部变量是相对而论的,我们先来看一个例子(这几个概念,我也不能很好的阐述)

g_var = 'this is global var'
def foo():
l_var = 'in the foo!this is local var'
print(g_var)
print(l_var)
def foo1():
l_var = 'in the other foo !this is local var'
print(g_var)
print(l_var)
foo()
foo1()
print(g_var)
print(l_var)

在这个例子中,g_var是在整个代码块中都生效的,那么g_var就是这个代码块的全局变量,而l_var只在函数foo中生效,那么l_var就是foo的局部变量.而在foo1的l_var又是它自己内部定义的局部变量

当局部变量和全局变量同名时,局部变量只在他所属的代码块内生效.并不能影响代码块外的全局变量.同时需要注意的是,局部变量优先.

some_var = 'this is global var'
print(some_var)
def foo():
some_var = 'this is local var'
print(some_var)
foo()
print(some_var)

返回值

在函数中使用ruturn语句,让函数返回一个结果给函数外的调用.如果没有定义ruturn,函数会返回一个None.当函数执行了return将会跳出函数,不再继续执行函数中的代码

#没有ruturn的返回值
def foo():
print('welcome')
a = foo()
print(a)
#定义return的返回值和return后的代码不会执行
def foo(x,y):
z = x + y
return z
print('welcome')
a = foo(1,2)
print(a)

嵌套函数

在函数中嵌套一层函数

def first_func():
print('in the first')
def second_func():
print('in the second')
second_func()
first_func()
second_func() #此时在外面是不能调用嵌套内的函数

补充,使用嵌套函数去试试局部变量能更好的理解局部变量的使用

匿名函数

lamba主体通常就是一个表达式,是函数的一个高级用法,在某些特定场景需要使用函数时使用

sum = lambda arg1, arg2: print(arg1 + arg2);
sum(1,2) def func(arg1,arg2):
print(arg1+arg2)
func(1,2)

列表生成式:

列表生成式表现方式类似于三元运算和匿名函数lambda函数.通过简化代码执行一个教复杂的运算逻辑.这算是函数的一个扩展场景吧

#普通代码
def func(i):
if i < 5:
i=i+1
else:
i=i*2
return i
a = []
for i in range(10):
num = func(i)
a.append(num) #通过列表生成式来完成相同的功能
def func(i):
if i < 5:
i=i+1
else:
i=i*2
return i
a = [func(i) for i in range(10)]

补充 三元运算表达式: 为真时的结果 if 判定条件 else 为假时的结果

a = 2 if 1>3 else 6

print(a)

a = 2 if 1>3 else 6

print(a)

python3基础(七)函数基础的更多相关文章

  1. python基础(七)函数

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后 ...

  2. Day9 Python基础之函数基础(七)

    参考链接:https://www.cnblogs.com/yuanchenqi/articles/5828233.html 1.函数的定义 定义: 函数是指将一组语句的集合通过一个函数名封装起来,要想 ...

  3. Python 入门基础10 --函数基础3 函数对象、名称空间、装饰器

    今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...

  4. Python 入门基础11 --函数基础4 迭代器、生成器、枚举类型

    今日目录: 1.迭代器 2.可迭代对象 3.迭代器对象 4.for循环迭代器 5.生成器 6.枚举对象 一.迭代器: 循环反馈的容器(集合类型) 每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的 ...

  5. Python 入门基础8 --函数基础1 定义、分类与嵌套使用

    目录 零.了解函数 一.函数的组成 二.函数的定义 三.函数的使用 四.函数的分类 五.函数的嵌套使用 零.了解函数 1.什么是函数 在程序中函数就是具备某一功能的工具 2.为何用函数 为了解决以下问 ...

  6. Python 入门基础9 --函数基础2 实参与形参

    今日内容: 一.函数参数 1.形参与实参定义 2.实参分类 3.形参分类 4.可变参数的整体使用 一.形参与实参定义 def fn(参数们): pass 1.1 形参 定义函数,在括号内声明的变量名, ...

  7. Python 入门基础12 --函数基础5 匿名函数、内置函数

    今日内容: 1.三元表达式 2.列表.元组生成式 | 字典生成式 3.递归 4.匿名函数 5.内置函数 一.三元表达式 三元运算符:就是 if...else... 语法糖 前提:if 和 else # ...

  8. 七. Python基础(7)--文件的读写

    七. Python基础(7)--文件的读写 1 ● 文件读取的知识补充 f = open('file', encoding = 'utf-8') content1 = f.read() content ...

  9. PHP基础入门(三)---PHP函数基础

    PHP基础入门(三)---函数 今天来给大家分享一下PHP的函数基础.有了前两章的了解,想必大家对PHP有了一定的基础了解.想回顾前两章的朋友可以点击"PHP基础入门(一)"&qu ...

随机推荐

  1. git命令的使用

    git命令行的使用 0. 工作中常使用的命令行(小结) 假设我们工作共同使用的开发分支为dev,我自己的开发分支为dev_cx.安装git,在工作文件夹下打开git bash. $ git check ...

  2. eclipse中JPA插件的安装与使用

    说明 上周实验室学习了数据库设计相关的内容,其中涉及到将数据库实体化的问题,JPA是一个很好的实现工具,便开始着手于JPA的学习.因为JPA涉及到的知识还是挺多的,需要学习许多新的知识,所以对于JPA ...

  3. margin相关

    1.图片与文字对齐问题 如果图片和文字差不多大时,使用兼容性强的margin负值方法. 方法:img{margin:0 3px -3px 0;} 2.div嵌套后margin出现失效(转移)问题 原因 ...

  4. C# 委托详解(一)

    1.委托简单例子 class eeProgram { // 声明delegate对象 public delegate string CompareDelegate(int a, int b); // ...

  5. Django的设计模式

    MVC模式 MVC将应用程序分解为三个组成部分:mode(模型).view(视图).control(控制器),其中: M 管理应用程序的状态(通常存储到数据库中),并榆树改变状态的行为(或者叫&quo ...

  6. layui动态设置下拉框数据,根据后台数据设置选中

    追加下拉框数据: 设置默认选中: 正常的判断这种情况是不行的,因为追加出的数据,在前台显示的并不是同一个下拉框,原来的下拉框被隐藏了 因此需要:根据原来的位置,寻找下一个节点,寻找子节点的方式找到相应 ...

  7. 推荐:让你快速搞定各服务端(api,pc,mobile,wechat)代码

    如果你在写服务端 (PHP) ,会因为项目须求(做app.pc.mobiel.微信) 而写几套代码的,你不觉得很累吗? 现在的很多开源框架商用版本在做程序方面都是这么一套一套的,维护起来,二开起来特别 ...

  8. Android LayoutInflator 解析

    一.实际使用场景引入: 在ListView的Adapter的getView方法中基本都会出现,使用inflate方法去加载一个布局,用于ListView的每个Item的布局.  同样,在使用ViewP ...

  9. Spring基础篇——DI和AOP初识

    前言 作为从事java开发的码农,Spring的重要性不言而喻,你可能每天都在和Spring框架打交道.Spring恰如其名的,给java应用程序的开发带了春天般的舒爽感觉.Spring,可以说是任何 ...

  10. windows下 安装 rabbitMQ 及操作常用命令(操作创建用户密码 角色等)

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...