当前位置: 首页 > news >正文

python3基础(七)函数基础

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)

转载于:https://www.cnblogs.com/ops-sylar/p/8183772.html

相关文章:

  • php的命名空间
  • java Web相关零碎整理--厚积薄发
  • Hibernate执行原生SQL返回ListMap类型结果集
  • Android编译过程详解(一)
  • 【bootstrap】modal模态框的几种打开方法+问题集锦
  • denyhost防止SSH暴力破解
  • [国家集训队2012]middle
  • Design Pattern: Prototype 模式
  • Linux环境下shell和vim中乱码原因及消除办法
  • 利用Docker轻松玩转Cassandra
  • 搭建高可用mongodb集群(三)—— 深入副本集内部机制
  • 【算法专题】卡特兰数(计数数列)
  • 51cto任意密码修改(失效了)
  • Wannafly挑战赛7 C - 小Q与氪金游戏
  • [c#基础]DataTable的Select方法
  • 【5+】跨webview多页面 触发事件(二)
  • co模块的前端实现
  • Cumulo 的 ClojureScript 模块已经成型
  • eclipse(luna)创建web工程
  • express如何解决request entity too large问题
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JS+CSS实现数字滚动
  • MYSQL 的 IF 函数
  • October CMS - 快速入门 9 Images And Galleries
  • SwizzleMethod 黑魔法
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Web标准制定过程
  • Yeoman_Bower_Grunt
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 如何合理的规划jvm性能调优
  • 一起参Ember.js讨论、问答社区。
  • 用element的upload组件实现多图片上传和压缩
  • 用jQuery怎么做到前后端分离
  • linux 淘宝开源监控工具tsar
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 数据库巡检项
  • #stm32整理(一)flash读写
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (二)hibernate配置管理
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (转)大型网站架构演变和知识体系
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .bat批处理(一):@echo off
  • .Net 垃圾回收机制原理(二)
  • .Net 路由处理厉害了
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET关于 跳过SSL中遇到的问题
  • .net连接oracle数据库
  • .NET连接数据库方式
  • .Net中的设计模式——Factory Method模式