python中的函数

1.函数的目的

.避免代码冗余
.增强可读性

2.函数的定义与调用

# 定义函数 使用关键字def
"""
1.定义函数:
def 函数名():
函数体
""" def sayhello():
print("hello") """
2.调用函数:
函数名()
"""
sayhello()

3.函数返回值

# 函数的返回值
"""
1.什么都不写的情况下没有返回值
2.return # 没有返回值 # 结束函数
3.return None
4.return 变量
""" def say_hello1():
print("hello")
print(say_hello1()) def say_hello2():
print("hello")
return
print(say_hello2()) def say_hello3():
print("hello")
return None
print(say_hello3()) def say_hello4():
print("hello")
return "hello"
print(say_hello4())

序列解压

# 序列的解压
a, b, c, d = (1, 2, 3, 4)
print(a, b, c, d) # 1 2 3 4 a, _, _, d = (1, 2, 3, 4) print(a, d) # 1 4 a, *_ = (1, 2, 3, 4)
*_, d = (1, 2, 3, 4)
print(a, d) # 1 4
# 字典、列表、集合同样适用
a, b = {'name': 'eva', 'age': 18}
print(a, b) # age name

多个返回值

def demo():
"""多个返回值情况"""
return 1, 2, 3, 'a' """多个返回值,用一个变量接收时,得到的是一个元祖"""
a = demo()
print(a) # (1, 2, 3, 'a') """适用同等个数的变量接收,个数不相同,报错"""
a, b, c, d = demo()
print(a, b, c, d)

4.函数的参数

实参与形参

"""
1.定义函数使用的是形参
2.调用函数使用的是实参
"""

  

传参

实参角度

1.按照位置传参

def demo(x, y):
print(x, y) demo(10, 20)

2.按照关键字传参

def demo(x, y):
print(x, y) demo(y=10, x=20)

3.位置与关键字混用(位置参数必须在关键字参数的前面)

def demo(x, y):
print(x, y) demo(10, y=20) # 按照顺序

形参角度 : 位置参数必须传值

默认参数

def info(name, sex='male'):
"""将变化值较小的设置成默认参数"""
print(name, sex) # 调用函数时。默认参数可以不传值
info('a')
info('a', 'female')
def info(name, li=[]):
"""陷阱:默认参数是一个可变数据类型"""
li.append(name)
print(li) info('a') # ['a']
info('b') # ['a', 'b']

区别其他语言:

package com.zzz

object Test {
def demo(name: String, list: List[String] = Nil): List[String] = {
return name :: list
} def main(args: Array[String]): Unit = {
val a = demo("a")
val b = demo("b")
print(a, b) //(List(a),List(b))
}
}

动态参数

"""
动态参数:
按位置传值多余的参数都由args统一接收,保存成一个元组的形式
""" def to_sum(*args):
sum = 0
print(args)
for i in args:
sum += i
return sum a = to_sum(1, 2, 3)
print(a)
# (1, 2, 3)
#
b = to_sum(1, 2, 3, 4)
print(b) # (1, 2, 3, 4)
# # 接收k-v类型的参数 def info(**kwargs):
print(kwargs)
print(kwargs['name'], kwargs['sex']) info(name='a', sex='b')
# {'name': 'a', 'sex': 'b'}
# a b

5.命名空间及作用域

"""
1.python解释器开始执行之后,就在内存中开辟了一个空间
2.每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来
3.当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心
4.等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,
这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。
函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。 创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间
"""
# globals和locals方法
print(globals())
print(locals()) # 这中情况下,两种是一样的 def func():
a = 12
b = 20
print(locals()) # {'b': 20, 'a': 12}
print(globals()) func()
#global 关键字
a = 10
def func():
global a
a = 20 print(a) #10
func()
print(a) #20

6.函数嵌套

def f1():
print("in f1")
def f2():
print("in f2") f2()
f1()
"""
nonlocal关键字
# 1.外部必须有这个变量
# 2.在内部函数声明nonlocal变量之前不能再出现同名变量
# 3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
""" def f1():
a = 1 def f2():
a = 2 f2()
print('a in f1 : ', a) f1() # a in f1 : 1 def f1():
a = 1 def f2():
nonlocal a
a = 2 f2()
print('a in f1 : ', a) f1() # a in f1 : 2

7.函数名的本质

"""函数名本质上就是函数的内存地址
1.可以被引用
2.可以被当作容器类型的元素
3.可以当作函数的参数和返回值
""" def f1():
return '' f = f1()
print(f) def f2():
return '' def f3():
return ['a', 'b'] li = [f1(), f2(), f3()]
a = li[2]
print(a) dict1 = {'f1': f1, 'f2': f2, 'f3': f3}
b = dict1['f1'] # <function f1 at 0x0000000001420378>
c = dict1['f1']() #
print(b, c) dict1 = {'f1': f1(), 'f2': f2(), 'f3': f3()}
d = dict1['f1'] #
print(d)
print('---------------') def f5():
return f1()
a = f5()
print(a) #

8.闭包

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

def func():
name = 'eva'
def inner():
print(name)
"""
想要拿到函数内部的变量和函数,返回变量跟函数
闭包函数用途
在函数外部调用函数内部的函数
""" def func():
name = 'zhangsan' def inner():
print(name) return inner f = func()
f()

判断是否是闭包函数方法__closure__

# 输出的__closure__有cell元素 :是闭包函数
def f1():
name = 'zhangsan' def inner():
print(name) print(inner.__closure__) # (<cell at 0x0000000000E591C8: str object at 0x00000000008F37B0>,)
return inner f = f1()
f() # 输出的__closure__为None :不是闭包函数
name = 'zhangsan' def f2():
def inner():
print(name) print(inner.__closure__) # 判断inner函数是不是闭包函数 None
return inner f2 = f2()
f2()
def f1():
money = 1000
def f2():
name = 'zhangsan'
def f3():
print(name,money)
return f3
return f2 f = f1()
i = f()
i()

python基础篇_003_函数的更多相关文章

  1. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  2. Python基础篇(初始函数)

    Python初始函数: 一.什么是函数 1.我们到目前为止, 已经可以完成一些软件的基础功能了. 那么我们来完成这样一个功 能: 约x: print("拿出手机") print(& ...

  3. python 基础篇 匿名函数

    匿名函数基础 首先,什么是匿名函数呢?以下是匿名函数的格式: lambda argument1, argument2,... argumentN : expression 我们可以看到,匿名函数的关键 ...

  4. python 基础篇 自定义函数

    多态 我们可以看到,Python 不用考虑输入的数据类型,而是将其交给具体的代码去判断执行,同样的一个函数(比如这边的相加函数 my_sum()),可以同时应用在整型.列表.字符串等等的操作中. 在编 ...

  5. python 基础篇 10 函数进阶

    本节主要内容:1. 函数参数--动态传参2. 名称空间, 局部名称空间, 全局名称空间, 作⽤域, 加载顺序.3. 函数的嵌套4. gloabal, nonlocal关键字 ⼀. 函数参数--动态传参 ...

  6. python 基础篇 09 函数初识

    <<<<<<<<<<<<<<<------------------------------函         ...

  7. Python基础篇(三)_函数及代码复用

    Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...

  8. python基础篇之进阶

    python基础篇之进阶 参考博客:http://www.cnblogs.com/wupeiqi/articles/5115190.html python种类 1. cpython  使用c解释器生产 ...

  9. python基础篇(六)

    PYTHON基础篇(六) 正则模块re A:正则表达式和re模块案例 B:re模块的内置方法 时间模块time A:时间模块的三种表示方式 B:时间模块的相互转换 随机数模块random A:随机数模 ...

随机推荐

  1. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位dp)

    题目链接:https://ac.nowcoder.com/acm/contest/163/J 题目大意:给定一个数N,求区间[1,N]中满足可以整除它各个数位之和的数的个数.(1 ≤ N ≤ 1012 ...

  2. python学习day12 函数Ⅳ (闭包&内置模块)

    函数Ⅳ (闭包&内置模块) 1.内置函数(补充) lambda表达式也叫匿名函数. 函数与函数之间的数据互不影响,每次运行函数都会开一个辟新的内存. item = 10 def func(): ...

  3. luoguP4841 城市规划

    题意: 求n个点的无相连通图的个数.有编号 思路一: 黏博客 至于为什么除以k!:(没有博客中说的那么简单) 实际上, 对于一个n的用k个自然数的拆分,每一个拆分的贡献是: $\frac{n!*\Pi ...

  4. SQL Server 2008还原数据库时出现“备份集中的数据库备份与现有的数据库不同”的解决方法

    引言 现在在做项目,由于每个人是分模块的,所以大家的测试数据都不同步,导致好多时候会因为别人填的数据不同而调半天的错.所以我还是自己还原一个数据库,自己填自己的数据吧. 报错 之前还原过很多个数据库都 ...

  5. 【NOIP2013模拟】终极武器(经典分析+二分区间)

    No.2. [NOIP2013模拟]终极武器 题意: 给定你一些区间,然后让你找出\(1\sim 9\)中的等价类数字. 也就是说在任何一个区间里的任何一个数,把其中后\(k\)位中的某一位换成等价类 ...

  6. Java多线程_复习(更新中!!)

    java多线程的常见例子 一.相关知识: Java多线程程序设计到的知识: (一)对同一个数量进行操作 (二)对同一个对象进行操作 (三)回调方法使用 (四)线程同步,死锁问题 (五)线程通信 等等 ...

  7. CentOS7部署Dotnet Core2.1

    前言 笔者在毫无Linux部署.net core的经验下,第一次用了15分钟完成部署,第二次在生产环境用了5分钟.下文将说明如何在CentOS7下完成.NetCore2.1的部署,包括如何创建ASP. ...

  8. 第二节:框架前期准备篇之AutoFac常见用法总结

    一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势必会引起一点点小小的风波,我说我的好,他说他的好,非常容 ...

  9. IISExpress使用64位

    C#有一些函数如GetHashCode和x86,X64版本有关系,为了和服务器保持一致,本地iis Express也需要设置64位. 方法如下,vs2010不支持. vs2012可以手动添加配置 re ...

  10. TensorFlow资源整理

    什么是TensorFlow? TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示 ...