python函数

四、Python作用域、函数及编程范式 Python作用域、函数及编程范式 阅读详情

讲函数之前,先了解一下变量的作用域

变量作用域

2种变量作用域

  • 局部变量
  • 全局变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域,而局部变量只能在其被声明的函数内部访问,全局变量则可以在整个程序范围内访问

变量的作用域如下:

● L(Local):局部作用域
● E(Enclosing):闭包函数外的函数中
● G(Global):全局作用域
● B(Built-in):内建作用域

变量的属性与执行依据:

● 变量的先后顺序是:L –> E –> G –>B 的规则查找
● 在子程序中定义的变量称为局部变量
● 在程序的一开始定义的变量称为全局变量
● 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序
● 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用,在其它地方全局变量起作用
● 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了
● 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问

局部转全局: 将一个局部变量通过global关键字,转换为全局变量.

import os
import sys


def print_num():
    global num
    num = 1000
    print("函数内调用: ", num)

print_num()
print("函数外调用: ", num)

无参和有参函数

demo

#无参函数

def print_num():
    print("hello world!")

print_num()

#有参函数
def add(x,y):
    z=x+y
    print(z)

add(1,2)

函数参数的传递

Python中所支持的参数传递形式:

  • 普通参数:普通参数传递,在定义函数时就指定了规律是从左至右传递
  • 默认参数:定义函数时是使用"name=value"的语法直接给变量一个值,从而传入的值可以少于参数个数
  • 指定参数:调用函数时指定"name形式参数=value实际参数"的语法通过参数名进行匹配
  • 动态参数:在我们定义函数时,形式参数中收集任意多基于普通参数【定义函数时使用* :收集普通参数,返回元组,*args】【定义函数时使用**:收集指定参数,返回列表,**kwargs】
  • 动态参数解包:在调用函数时,使用**开头的参数,从而传递任意多基于普通或指定参数

demo

#普通传参
def stu(name,age,country):
    print("姓名:",name)
    print("年龄:",age)
    print("国际:",country)

stu("cc",18,"CN")

#带默认参数传递: 同样的,我们可以给指定的字段添加默认参数,如果用户不输入则默认使用指定参数
#这里需要注意的是:如果您要使用带默认参数的函数,则需要把带参数的字段,放在函数最后一项.
def stu2(age,country,name="aa"):
    print("姓名:",name)
    print("年龄:",age)
    print("国籍:",country)

stu2(23,"CN","aa")    #此时我们给予全部的参数则无默认值
stu2("cc",20,"AM")    #形参如何排列,实参就得如何排列  姓名: AM  年龄: cc  国籍: 20
stu2(18,"LOS")        #传递输入是忽略带有默认值的字段

#动态参数传递(传递列表): 若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数,传递一个列表.
def stu3(name,age,*args):
    print(name,age,args)

stu3("aa",22)
stu3("aa",22,"a","b","c")
ls=[1,2,3]
stu3("aa",22,ls)    #传入列表

#动态参数传递(万能参数): 我们使用*与**通常情况下可以传递任何值,所以称作万能参数.
def fun(*args,**kwargs):
    print(args,type(args))
    print(kwargs,type(kwargs))

ls2=[1,2,3,4,5]
dic={"a":1,"b":2,"c":3}
fun(*ls2,**dic)     #(1, 2, 3, 4, 5) <class 'tuple'>        {'a': 1, 'b': 2, 'c': 3} <class 'dict'>

函数的返回值

demo

#函数的返回值

def add(x,y):
    z=x+y
    print("函数内返回:",z)
    z+=10
    return z

z=add(1,2)
print("函数外返回:",z)

函数闭包:

闭包是由函数及其相关的引用环境组合而成的实体(闭包=函数+引用环境)这个从字面上很难理解。Python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).这个定义是相对直白的,好理解的,下面举一个简单的例子来说明.

def adds(x):
    def adder(y):return x+y
    return adder

c=adds(10)
print(type(c))
print(c.__name__)
print(c(10))

如上代码,在一个内部函数里:adder(y)就是这个内部函数,对在外部作用域(但不是在全局作用域)的变量进行引用:x就是被引用的变量,x在外部作用域adds里面,但不在全局作用域里,则这个内部函数adder就是一个闭包.闭包=函数块+定义函数时的环境,adder就是函数块,x就是环境,当然这个环境可以有很多,不止一个简单的x.

函数嵌套与递归

除了函数的闭包以外,函数还支持两种调用方式,一种是嵌套函数,另一种是递归函数,这里需要注意的是,最好在开发中尽量少用这样的结构,这种结构一旦层数变多将很难后期进行维护,所以你懂的

demo:嵌套函数

import os

name = "cc"

def chage_name():
    name = "cc blog"

    def chage_name_new():
        name = "xiao blog"
        print("第3层循环打印: ", name)

    chage_name_new()  # 在函数内部调用内部的函数
    print("第2层循环打印: ", name)  # 第二层函数执行结果


chage_name()  # 调用最外层函数
print("查看最外层变量: ", name)  # 查看外层变量

运行结果:

第3层循环打印:  xiao blog
第2层循环打印:  cc blog
查看最外层变量:  cc

demo2:递归函数

import os
 
def fun(n):
    if 0==n:              # n=0 的话直接返回空,对用户输入的零进行判断
        return None
    elif 1==n:            # n=1 的话就不再递归
        return n
    else:
        return n*fun(n-1) # 递归在执行f(n-1),直到f(1)
 
print(fun(5))             # 120

'''
    f(5)的执行过程如下
        ===> f(5)
        ===> 5 * f(4)
        ===> 5 * (4 * f(3))
        ===> 5 * (4 * (3 * f(2)))
        ===> 5 * (4 * (3 * (2 * f(1))))
        ===> 5 * (4 * (3 * (2 * 1)))
        ===> 5 * (4 * (3 * 2))
        ===> 5 * (4 * 6)
        ===> 5 * 24
        ===> 120
'''

用递归实现二分法:

data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
 
def binary_search(dataset,find_num):
    print(dataset)
 
    if len(dataset) >1:
        mid = int(len(dataset)/2)
        if dataset[mid] == find_num:             #find it
            print("找到数字",dataset[mid])
        elif dataset[mid] > find_num :           # 找的数在mid左面
            print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])
            return binary_search(dataset[0:mid], find_num)
        else:                                    # 找的数在mid右面
            print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid])
            return binary_search(dataset[mid+1:],find_num)
    else:
        if dataset[0] == find_num:               #find it
            print("找到数字啦",dataset[0])
        else:
            print("没的分了,要找的数字[%s]不在列表里" % find_num)
 
binary_search(data,66)

匿名函数

demo

#匿名函数的使用
# 定义匿名函数方式1(普通方式)
def func(arg):
    return arg + 1

result = func(123)
print(result)

# 定义匿名函数方式2(lambda表达式)
my_lambda = lambda arg: arg + 1
# 执行函数
result = my_lambda(123)
print(result)
Python之函数 将一段实现功能的完整代码,使用函数名称进行封装,通过函数名称进行调用使用关键字def确定函数名称、参数名称、参数个数、编写函数体(用于实现函数功能的代码)在函数定义处的参数和函数内部定义的变量在函数外定义的变量或函数内部使用global关键字修饰的变量指没有名字的函数。这种函数只能使用一次在一个函数的函数体内调用该函数本身。 阅读详情

相关推荐

【首份】2023年30米分辨率土地利用遥感监测数据

为了恢复和重建我国土地利用变化的现代过程,更好地预测、预报土地利用变化趋势,地球资源数据云以美国陆地卫星Landsat 遥感影像数据作为主信息源,结合Sentinel系列数据,通过人工目视解译和机器学习方法,建立了国家尺度1:10 万比例尺多时期土地利用/土地覆盖遥感监测数据库(CNLUCC)因早期Landsat数据时空覆盖缺失,1972-1977年合成第一期数据,1978-1985年合成第二期数据,1986年起每年度生成一期数据。投影:Albers正轴等面积双标准纬线圆锥投影南标准纬线:25°N。

地球资源数据云的官方博客 3665

python中的各种作用域

python中作用域

weixin_44835655的博客 4021

pgpool-II安装部署

文章介绍了pgpool-II的核心功能、架构组成以及实际部署的关键配置步骤

weixin_41690116的博客 1422

python——作用域

python的作用域和命名空间,高阶函数介绍

qq_34683631的博客 3849

STM32 使用rtthread的DMA 串口发送失败

在一次使用RTthread的DMA 串口发送时,持续性通过DMA 发送串口数据时,偶发发送过程中后续数据包无法正常发送出去,后经查,发现为RT-Thread的串口中断处理有瑕疵,后做出修改。另,为了更方便的排查为题,建议修改。左为修改前,右为修改后。

qq_39294918的博客 1107

matlab中高频变压器怎么找,干货|手把手教你绕制高频变压器

原标题:干货|手把手教你绕制高频变压器绕制一个变压器所需材料:磁芯、骨架、各种铜线、麦拉胶带。变压器参数:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:1380±10%uH漏感:≤44uH引脚分布图: 特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间...

weixin_30895121的博客 2123

Python编程 函数作用域

本章将会讲解Python编程中的 函数的作用域。

yj11290301的博客 1084

CentOS 7 离线升级 OpenSSH 9.9p2 保姆级教程(含依赖包下载与常见报错解决)

本文提供了一份详尽的CentOS 7系统离线升级OpenSSH至9.9p2版本的完整教程。针对无外网环境,重点讲解了依赖包(尤其是OpenSSL 3.x)的离线下载与编译部署,并深入解决了编译过程中常见的“libcrypto.so缺失”等动态库链接错误。教程涵盖从环境准备、源码编译、服务配置到系统集成的全流程,最后还提供了关键的回滚方案与应急预案,是运维人员在内网环境中进行安全加固的实用指南。

weixin_29248313的博客 323

python函数作用域

4.nonlocal关键字修饰变量名后,标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,则nonlocal位置会发生错误。2.全局变量:全局变量可作用于整个程序范围内,在函数体外声明的是全局变量,全局变量在函数体内只能访问不能修改。1.局部变量:只在其被声明的函数体内被访问和修改,在函数体内声明的是局部变量。(函数嵌套:上一级函数体中声明的变量可在该函数体中的嵌套函数中的下一级使用)。python函数作用域分为局部作用域和全局作用域。函数体内修改全局变量需要使用global关键字)

m0_69735751的博客 368

Widar3.0复现日志(DFSExtractionCode)

需要使用的matlab基本功能

XiaoQiXiaoWei_J的博客 2436

46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)

在上章我们学习了45.qt quick-qml虚拟软键盘详解(一)_诺谦的博客-优快云博客 接下来我们便来自定义一款好看的qml软键盘.如下图所示: 支持背景更换、支持动图: 支持动态加载移除语言: 支持拖拽、自由缩小放大: 支持定位坐标: ...

抵抗时间扭曲,坚持做一件有意义的事 4674

python中各种函数的用法,python中常见的函数

30. ords()和chr(ASCII)函数:将字符串转化为ASCII或将ASCIIIS\转化为字符串。20. urllib.urlopen(url).read():打开网络内容并存储。6. int()函数、float()函数、str()函数等:类型的转化函数。32. strip()、lstrip()、rstrip()函数:去除空格。49. list.remove(“s”)函数:将数据中第一次出现的s删掉。44. s.insert(3,-1)函数:在3的位置之前插入数据-1。

zjl102562的博客 1037

esp8266步进电机驱动控制

blinker控制步进电机起保停,正反转(Arduino uno+esp8266+TB6600驱动器) Arduino uno的板子的程序 esp8266板子接入到Arduino uno的控制引脚上的5,6,7 esp8266程序 //****库***** #define BLINKER_WIFI //官方wifi协议库 #define BLINKER_PRINT Serial //串口协议库 #include <Blinker.h&gt

perseverance51博客 2853

python中各种函数的用法,python常用函数大全

大家好,小编来为大家解答以下问题,python中各种函数的用法,python常用函数大全,现在让我们一起来看看吧!

a17348的博客 1026

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python函数总结

本章总结了python中函数的基础知识点

2403_86719076的博客 1701

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python content函数_python函数内容

在刚接触python的时候就有个疑问,什么是函数? python语言的函数和数学语言的函数有区别吗?什么是函数数学函数:给定一个数集A,假设其中的元素为x。现对A中的元素x施加对应法则f,记作f(x),得到另一数集B。假设B中的元素为y。则y与x之间的等量关系可以用y=f(x)表示python函数:函数就是一段事先组织好的,它具有可重复性,封装好,用来实现某个相关联功能的代码段,函数能提高应用的模...

weixin_39732316的博客 4173

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python函数

函数体#进行一些操作def用于声明一个函数,告诉python这是一个函数的定义。:函数名,一个有效的标识符,命名规则和变量名一致。parameters:形参,可以是0 ~ n 个,参数之间用逗号分隔。函数体:定义函数执行的具体操作。return:指定函数的返回值,没有则返回None。return后面的代码不会执行。lambda函数通常用在需要一个短小函数的地方。

bright_colo的博客 967

python 函数嵌套函数_Python中的嵌套函数

python 函数嵌套函数A nested function is simply a function within another function, and is sometimes called an "inner function". There are many reasons why you would want to use nested functions, and we'll g...

2873

【python函数】

函数在很多编程语言中都是一种基本的构建块,它们使得程序更加灵活、可维护和可扩展。

weixin_49451038的博客 1823

python函数怎么打_python ln函数怎么打

在python语言中,ln函数不是直接调用ln,而是调用math包中的log,或cmath包中的log。工具/原料pythonpycharm截图工具台式机ppt2019方法/步骤1打开pycharm工具,在指定包中新建python文件2在新建的python文件中,导入math和cmath包,然后使用dir查看对应包的方法3保存代码并直接使用应用运行,控制台查看打印结果4调用math包中的log函数...

weixin_39984442的博客 1万+

python中各种函数的用法,python基本函数有哪些

大家好,小编为大家解答python中各种函数的用法的问题。很多人还不知道python基本函数有哪些,现在让我们一起来看看吧!

2401_82891133的博客 940

python函数说明

函数的作用:简化代码提高代码重用性便于维护和修改提高代码的可扩展性函数的三要素:功能 len() max() sum()参数 s.clear() s.append('Python')返回值 s.sort() s1 = sorted(s)函数的分类:从定义角度—— 内置函数【别人写好的,你直接用】 自定义函数从参数角度—— 无参函数 有参函数。

2301_80488671的博客 1884

python bin函数_python bin函数

Python bin函数最后更新于:2020-03-21 12:04:25一.bin函数简介bin()函数是python的一个内置函数,主要功能是返回整形(int)或者长整形(long int)的二进制表示;可能有小伙伴会问:1.整形(int)或者长整形(long int)区别:两者的区别在于取值范围不同,整形取值范围:-32768~32767,而长整形取值范围更大,范围:-2147483648~...

weixin_39838231的博客 8360
上一篇: 数据容器间的转换和总结
下一篇: python中的模块和包
Cc_sec
博客等级 码龄8年 6粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值