从零开始学习python 7(持续更新ing)

news2024/11/26 13:17:41

一、Python函数

1.1 函数的定义

函数的定义:实现【特定功能】的代码块。

函数的作用:

    1. 简化代码
    2. 提高代码重用性
    3. 便于维护和修改
    4. 提高代码的可扩展性

函数的三要素:

    1. 功能 len() max() sum()
    2. 参数 s.clear() s.append('华清远见')
    3. 返回值 s.sort() s1 = sorted(s)

函数定义的语法格式:

 

函数的分类:

    1. 从定义角度—— 内置函数【别人写好的,你直接用】 自定义函数
    2. 从参数角度——无参函数 有参函数
    3. 从返回值角度——无返函数 None 有返函数

函数的调用/使用:

    1. 无返函数 函数名()
    2. 有返函数 方法1:print(函数名())
                     方法2:变量名 = 函数名()
def my_fun():
    print("这是我的函数")

print(my_fun)
# 输出结果是   <function my_fun at 0x000002AA6DF7A3E0>
# 说明函数名是一个内存地址

# 无返函数直接调用
my_fun()

def you_fun():
    return 100

# 有返函数,输出调用
print(you_fun())

# 有返函数,使用变量接收调用
ret = you_fun()
print(ret)

1.2 函数的参数传递

函数在进行参数传递的时候,分为:位置参数、关键字参数、默认参数、位置不定长参数、关键字不定长参数。

位置参数:传递参数时应该 和 定义时的参数 保持位置和数量一 一对应。

def fun(a, b, c):
    print(a, b, c)

# fun()
# TypeError: fun() missing 3 required positional arguments: 'a', 'b', and 'c'

fun(1, 2, 3)
#运行结果 1 2 3
fun('张三', 18, '男')
#运行结果 张三 18 男
fun([1,2,3], (4,5,6), {7,8,9})
# 运行结果 [1, 2, 3] (4, 5, 6) {8, 9, 7}
def fun(a:int, b:float, c:str):
    print(a, b, c)

# 有警告,无报错,以实际传参为准
fun(1, 2, 3)

fun(3.15, 7, [1,2,3])

关键字参数:调用函数传递参数时,按照 参数名=值 的方式,传参的顺序可以和定义参数的顺序不一致。 

def fun(name, age, sex):
    print(name, age, sex)

# 关键字参数
fun(name='张三', age=18, sex='男')
fun(age=18, sex='男', name='张三')

默认参数:在函数定义时给参数设置默认值,那么在函数调用时,若不传参就是用默认值,若传参就是用传参的值。 

def fun(name='张三', age=18, sex='男'):
    print(name, age, sex)

# 默认参数
fun()
fun('李四')
fun(age=66)
fun('小明', 30)
fun('小华', 23, '女')

位置不定长参数:在定义函数时参数名前加 * ,也就是def fun( *args ),那么在传参的时候就可以传若干个位置参数。将参数打包成——元组。

def fun(*num):
    print(num)
fun(1)
fun(1,2)
fun(1,2,3,4,5,6)

# 问:在一个函数中,位置不定长参数,可以有两个吗?
# 不允许
# 再问:一旦定义了位置不定参参数,是不是就不可以定义其他参数了呢?
# 答:可以定义,但是传参时必须是关键字参数

def test(*num, a, b):
    print(num)
    print(a)
    print(b)

test(1,2,3,4,a=5,b=6)

def test1(a, b, *num):
    print(a)
    print(b)
    print(num)

test1(1, 2, 3,4,5,6,7)

def test2(a, *num, b):
    print(a)
    print(num)
    print(b)

test2(1, 2,3,4,5, b=66)

关键字不定长参数:在定义函数参数名前加 ** ,也就是 def fun( **kwargs ),那么传参的时候就可以传若干个 关键字参数。

将参数打包成——字典。

def fun(**kwargs):
    print(kwargs)

fun(a=12, b=13, c=15)
fun(姓名='张三', 年龄=18, 性别='男')

形参:函数定义时的参数,没有实际意义

def fun(a)

def fun(a:int)

def fun(*a)

def fun(**a)

实参:函数调用/使用时的参数,有实际意义

fun(1, 'a', 13.14, True, [1,2], (3,4), {1,2})

fun( len(s) )

练习题: (1)定义函数,参数为位置可变长参数, 请将传入的所有实参按照升序输出

def fun(*num):
    return sorted(num)
print(fun(5,4,7,8,9,1,2,3,0))

 

(2)定义函数,参数为关键字可变长参数,请将其中HuaHua的身高修改为160, 然后打印出所有身高不足180的姓名, 使用fun(XiaoMing=155,XiaoHong=171,XiaoHei=192,HuaHua=2333)调用测试 

def fun(**name):
    name['HuaHua']= 160
    for i in name:
        if name[i] < 180:
            print(i,end=' ')
fun(XiaoMing=155,XiaoHong=171,XiaoHei=192,HuaHua=2333)

 

1.3 函数的返回值

(1)如果函数的运行结果想在函数外使用,就需要设置返回值。

(2)使用关键字 return 进行返回。

(3)return 可以在函数中出现多次,但是只执行 1 次,遇见return返回值并结束函数。

(4)与C语言不同,python中的return可以返回一个值或多个值,这个时候将返回的多个值到打包成一个元组。

ef fun(*num):
    my_sum = 0
    for i in num:
        my_sum += i
    return my_sum

ret = fun(3,7,2,9,8)
print(ret, type(ret))
def fun1(*num):
    my_sum = 0
    even_sum = 0
    odd_sum = 0
    for i in num:
        my_sum += i
        if i%2==0:
            even_sum += i
        else:
            odd_sum += i
    return my_sum, even_sum, odd_sum

res = fun1(2, 8, 7, 3, 11, 10)
print(res, type(res))

a, b, c = fun1(2, 8, 7, 3, 11, 10)
print(a, b, c)

 简单函数练习题

(1)定义函数,无参无返,可求出200以内所有包含7的数字

def fun():
    for i in range(0,200):
        if '7' in str(i):
            print(i,end=' ')
fun()
print()

 

(2)定义函数,无参有返,可返回200-300所有偶数组成的数列 

def fun1():
    list1=[]
    for i in range(200,300,2):
        list1.append(i)
    return list1
print(fun1())

 

(3)定义函数,有参无返,可接收任意一个字符串,并计算该字符串有几个字符 

def fun(a):
    count=0
    for i in a:
        count +=1
    print(count)
fun("abcd")

 

(4)定义函数,有参有返,可接收任意一个字符串,对其进行去重,返回去重后的集合 

def fun1(a):
    list1=[]
    for i in a:
        if i not in list1:
            list1.append(i)
    return list1
print(fun1("abcddcs"))

(5)定义函数, 可输入一个字符串,并打印出其中的所有数字 

def fun5():
    a=input()
    for i in a:
        if i.isdigit():
            print(i,end=" ")
fun5()

 

(6)定义函数,可接收一个数字列表,并返回其中的最大值和最小值, 要求:不可以在自定义函数内调用max和min函数 

def fun(list):
    max=list[0]
    min=list[0]
    for i in list:
        if i>max:
            max=i
        if i<min:
            min=i
    return max,min
a,b=fun([1,2,3,4,5,6,7,8,9,10])
print(a,b)

 

(7)定义函数,可打印三行四列矩形 

def fun7():
    for i in range(3):
        for j in range(4):
            print('*', end='')
        print()
# 测试函数
fun7()

 

(8)定义函数,计算1-100的所有数字的和 

def fun8():
    sum = 0
    for i in range(1, 101):
        sum += i
    return sum
# 测试函数
print(fun8())

 

(9)定义函数,参数为关键字可变长参数,请计算并返回他们的平均身高, 使用(xiaoming='178cm',xiaobai='182cm',xiaohong='166cm',xiaohei='174cm')

def fun7(**kwargs):
    total_cm = 0
    for height in kwargs.values():
        total_cm += int(height.replace('cm', ''))
    average_cm = total_cm / len(kwargs)
    return average_cm


# 测试函数
res=fun7(xiaoming='178cm', xiaobai='182cm', xiaohong='166cm', xiaohei='174cm')
print(f"平均身高是:{res}cm")

 

1.4 递归函数 

问:一个函数的调用放在哪里?——函数外

问:能在一个函数里面调用这个函数本身吗?——可以,但是会出现"死递归",类似于"死循环"

问:函数自己调用自己,有几种形式呢?

直接调用 A 调用 A

间接调用 A 调用 B , B 调用 A

观察:函数调用的执行顺序

函数自己调用自己的时候,若不添加控制条件,会一直调用。

所谓的递归函数就是自己调用自己的函数。

递归的思想:把一个大规模问题分解成相似的小规模问题,再将小规模问题分解成相似的小小规模问题……。

# 要求定义一个函数,实现输出N遍"我爱python"
def fun(N:int):
    while True:
        print("我爱python")
        N -= 1
        if(N==0):
            break

fun(10)

# 要求定义一个递归函数,实现输出N遍"我爱python"
def rec(N:int):
    if N==0:
        return
    else:
        print(f"{N}我爱python")
        rec(N-1)
rec(10)

对比发现:循环和递归很相似,基本上他们两个可以相互转换。

(1)大多数情况下,循环的效率、性能更好一些

(2)循环代码容易书写,阅读性差

(3)递归代码写起来稍难,阅读性好

递归函数有三要素:

(1)边界条件/基线条件 跳出/结束递归的条件

(2)递归返回段 满足结束条件时,返回

(3)递归前进段 不满足结束条件时,前进/继续递归

# 定义一个递归函数,求n的阶乘
# 阶乘:就是累乘,从1累乘到本身  或者从本身累乘到1
# 5! = 1*2*3*4*5 = 5*4*3*2*1
def rec(n):
    """
    求一个数n的阶乘
    :param n: 接收到一个整型值
    :return: 计算的阶乘结果
    """
    if n==1:
        return 1
    else:
        return n * rec(n-1)

n = 5
print(rec(n))

 递归函数练习题

(1)求第6个斐波那契数

def fib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
print(fib(6))

 

(2)使用递归函数求5的阶乘 

def fac(n):
    if n == 1:
        return 1
    else:
        return n * fac(n - 1)
print(fac(5))

 

 (3)使用递归函数求50-100的总和

def sum(n):
    if n == 50:
        return 50
    else:
        return n + sum(n - 1)
print(sum(100))

 

(4)已知有5个人坐在一起,第5个人说他比第四个人大5岁, 第4个人说他比第三个人也大5岁,以此类推,第一个人说他19岁, 请问,第五个人多少岁 

def age(n):
    if n == 1:
        return 19
    else:
        return age(n - 1) + 5
print(age(5))

 

(5)使用递归函数求n的k次方 

def power(n,k):
    if k == 1:
        return n
    else:
        return n * power(n,k-1)
print(power(2,3))

 

(6)使用递归函数判断一个字符串是不是回文字符串 

def is_palindrome(s):
    if len(s) <= 1:
        return True
    else:
        return s[0] == s[-1] and is_palindrome(s[1:-1])
print(is_palindrome("12345678987654321"))

 

1.5 函数中变量的作用域 

变量的作用域:是指变量能起作用的范围,根据作用范围大小不同分为全局变量和局部变量。

(1)全局变量:定义在函数外,作用范围是整个程序,程序结束时全局变量声明周期结束。

(2)局部变量:定义在函数代码块里或者函数的参数里,作用范围是整个函数,函数执行结束时局部变量生命周期结束。

 

quanju = 10

def fun1():
    print(quanju)

def fun2():
    print(quanju)

# 全局变量都能用
print(quanju)
fun1()
fun2()
def fun1():
    a = 10
    print(a)

def fun2():
    print(f"fun1函数中的{a}")

# 局部变量只能在该函数内使用
fun1()
# fun2()  报错
# print(f"fun1函数中的{a}") 报错
def fun1():
    global a
    a = 10
    print(a)

def fun2():
    print(f"fun1函数中的{a}")

# 若想在函数外,使用该函数的局部变量,
# 使用global关键字将该变量修饰为全局变量
fun1()
fun2()
print(f"fun1函数中的{a}")
# 全局变量
a = 100

def fun():
    # 局部变量
    a = 200
    print(a)

print(a)    # 100
fun()       # 200

# 从这里可以看到,局部变量可以和全局变量重名,但是
# 局部变量覆盖全局变量【遵循就近原则】

1.6 函数嵌套

函数嵌套:在一个函数的内部 还嵌套定义了 另外一个函数。

外部的我们称之为 外函数,内部的我们称之为 内函数。

 

x = 100
def out_fun():
    # global x
    x = 200
    def in_fun():
        # global x
        x = 300
        print(f"内函数中输出{x}")
    in_fun()
    print(f"外函数中输出{x}")

out_fun()
print(f"函数外输出{x}")

运行结果:    【和C语言是有区别的,可以通过绑定关键字global修改】
内函数中输出300
外函数中输出200
函数外输出100

通过上面的例子可以发现:
内函数局部变量 > 外函数局部变量 > 全局变量

对比global 和 nonlocal:
① global 修饰全局变量
② nonlocal 修饰该函数上一层的局部变量

1.7 闭包函数

什么是闭包函数?——如果内函数中使用了外函数的局部变量,并且外函数把内函数返回的过程就叫闭包。

形成闭包的条件:

(1)函数嵌套

(2)将内函数作为返回值返回

(3)内函数必须使用外函数的局部变量

x = 100
def out_fun():
    # global x
    x = 200
    def in_fun():
        # global x
        nonlocal x
        x = 300
        return x
    return in_fun()


print(out_fun())
print(f"函数外输出{x}")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2236123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NUMAP应用成果亮相中国核学会核反应堆热工流体力学分会第四届学术年会

10月28日-30日&#xff0c;中国核学会核反应堆热工流体力学分会第四届&#xff08;2024年&#xff09;学术年会在北京隆重召开。该学术年会是我国反应堆热工流体领域中方向设置最全、规模最大、最具影响力的学术交流盛会。大会共设置3个专题研讨会、8个主题论坛&#xff0c;组织…

Odoo:免费开源的医药流通行业信息化解决方案

文 / 开源智造Odoo亚太金牌服务 方案概述 开源智造Odoo免费开源ERP提供面向医药批发采、供、销业财一体化&#xff0c;及直接面向消费者的门店终端、全渠道管理、营销管理以及GSP合规管理解决方案&#xff0c;提升企业运营效率和全业务链条的数字化管控、追溯能力。 行业的最新…

支付业务以及支付业务的质量保障

前一段时间要在组里分享支付业务&#xff0c;网上找了很多文章&#xff0c;发现有好多也是我自己写的。回头看看3年前的文章&#xff0c;当时对支付有一定的测试经验&#xff0c;但是对支付的了解也不是很深。 经过这近两年的支付相关的测试经验&#xff0c;对支付业务有了更深…

实现视频一键压缩的10款工具大盘点:

在这个信息爆炸的时代&#xff0c;我们们已经习惯了那些高清的4K视频&#xff0c;但是却出现了新的问题。那就是文件过大臃肿。不用担心&#xff0c;你可以使用视频压缩工具来解决这个问题&#xff1b;市场上的视频压缩工具可谓五花八门&#xff0c;不仅具备了智能的算法压缩技…

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs&#xff0c;创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件&#xff08;可选&…

《现代网络技术》读书笔记:SDN数据平面和OpenFlow

本文部分内容来源于《现代网络技术&#xff1a;SDN,NFV,QoE、物联网和云计算&#xff1a;SDN,NFV,QoE,IoT,andcloud》 SDN数据平面 SDN 数据平面也称为基础设施层&#xff0c;而在ITU-T的Y3300标准中则称为资源层&#xff0c;它是网络转发设备根据 SDN控制平面的决策来执行数据…

无线婴儿监视器方案(附SI24R1选型)

随着现代科技的进步&#xff0c;父母们对宝宝的关注和保护达到了前所未有的高度。为了满足这一需求&#xff0c;市场上涌现出了一系列智能婴儿监视器。这些设备不仅能实时监控宝宝的活动&#xff0c;还能让父母在家中的任何角落都能轻松掌握宝宝的动态。今天&#xff0c;我们向…

Sigrity Power SI 3D-EM Full Wave HSSO模式如何进行高速差分过孔结构仿真扫描分析以及反标到Allegro操作指导

Sigrity Power SI 3D-EM Full Wave HSSO模式如何进行高速差分过孔结构仿真扫描分析以及反标到Allegro操作指导 高速差分过孔的优化是仿真分析中比较重要的一个环节,Sigrity Power SI 的3D-EM Full-Wave HSSO模式就是对高速差分过孔结构进行优化一个工具,可以不同的参数进行…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十. 多线程控制帧率。循环播放,QT connect 细节,

在前面&#xff0c;我们总结一下前面的代码。 在 FactoryModeForAVFrameShowSDL 构造函数中 init SDL。 通过 QT timerevent机制&#xff0c;通过startTimer(10);每隔10ms&#xff0c;就会调用timerEvent事件。 在timerEvent事件中&#xff0c;真正的去 读取数据&#xff0c…

WebRTC 环境搭建

主题 本文主要描述webrtc开发过程中所需的环境搭建 环境&#xff1a; 运行环境&#xff1a;ubuntu 20.04 Node.js环境搭建 安装编译 Node.js 所需的依赖包: sudo apt-get update sudo apt-get install -y build-essential libssl-dev 下载 Node.js 源码: curl -sL htt…

libgdiplus在MacOS M1上问题:Unable to load shared library ‘libgdiplus‘

libgdiplus在MacOS M1上问题&#xff1a;Unable to load shared library libgdiplus 问题解决步骤1步骤2 问题 在mac上的pycharm中执行下面的代码时出现下面的错误 slide.get_thumbnail( RuntimeError: Proxy error(TypeInitializationException): The type initializer for…

【VScode】VScode内的ChatGPT插件——CodeMoss全解析与实用教程

在当今快速发展的编程世界中&#xff0c;开发者们面临着越来越多的挑战。如何提高编程效率&#xff0c;如何快速获取解决方案&#xff0c;成为了每位开发者心中的疑问。今天&#xff0c;我们将深入探讨一款颠覆传统编程体验的插件——CodeMoss&#xff0c;它将ChatGPT的强大功能…

关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧

文章目录 1. sizeof 和 strlen1.1 sizeof1.2 strlen 2. 数组和指针结合的试题深入解析2.1 一维数组2.2 字符数组代码1代码2代码3代码4代码5代码6 2.3 二维数组 3.指针运算的试题深入解析题1题2题3题4题5题6题7 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力…

flutter 专题四 Flutter渲染流程

一、 Widget - Element - RenderObject关系 二、 Widget 、Element 、RenderObject 分别表示什么 2.1 Widget Widget描述和配置子树的样子 Widget就是一个个描述文件&#xff0c;这些描述文件在我们进行状态改变时会不断的build。但是对于渲染对象来说&#xff0c;只会使用最…

Netty 编码器 解码器 正确使用姿势

Netty 编码器 & 解码器 正确使用姿势 通过前面文章的例子&#xff0c;相信读者也感受到了Netty 开发核心工作在于处理读事件&#xff08;解码&#xff09;、写事件&#xff08;编码&#xff09;。 Netty 的编解码器是处理网络数据编码和解码的核心组件&#xff0c;编解码…

基于微信小程序的电子购物系统的设计与实现(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

FIPS203 后量子安全ML-KEM(标准简读)

FIPS 203是美国国家标准与技术研究院&#xff08;NIST&#xff09;发布的关于模块格基密钥封装机制&#xff08;ML-KEM&#xff09;的标准&#xff0c;旨在提供一种能抵御量子计算机攻击的密钥建立方案。以下是对该文档的详细总结&#xff1a; 标准概述 目的与范围&#xff…

鸿萌数据迁移服务: 企业服务器整机在线热迁移, 实现不停机业务转移

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

macOS15.1及以上系统bug:开发者证书无法打开,钥匙串访问无法打开一直出现图标后立马闪退

团队紧跟苹果最新系统发现bug:今日设备信息如下,希望能带给遇到这个问题的开发者一点帮助。 错误图如下: 点击证书文件后,先出现钥匙串访问图标,后立马闪退消失 中间试过很多方法,都是一样的表现,最后好在解决了,看网上也没有相关的帖子,这里直接写解决办法和导致原因…

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N 2024/11/2 18:04 在WIN10使用程序&#xff1a;ViewLink-4.0.7_0708-windows-x64.exe 在荣品PRO-RK3566开发板的预置Android13下使用&#xff1a;ViewLink-2023_12_21-release-0.2.6.apk adb install…