【Python】#4 函数与组合数据类型


一、函数的基本使用

函数是一段具有特定功能的、可重用的语句组通过函数名进行完成功能调用
每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理,同时选择性的反馈相应的处理结果。

  • 函数定义的语法格式:
    在这里插入图片描述
    • 注意相对于def关键字,函数体必须保持一定的空格缩进。
    • 以及Python中的函数允许返回多个参数。如果没有return 语句,返回None结果
      在这里插入图片描述

lambda函数

lambda函数是一种匿名函数,即没有名字的函数
使用Lambda保留字定义,函数名是返回结果
lambda函数用于定义简单的、能够在一行内表示的函数

基本格式:
在这里插入图片描述
func_name=lambda [arg1 [,arg2,.....argn]]:expression

  • 参数可以有缺省值,如x=1,y=2
  • lambda函数可以不需要名称,也被称为匿名函数,常用于作为参数传递给其他函数,如
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x * x, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]

函数的传参方式与可变参数

Python中函数的传参方式基本与C中类似,存在形参实参的值传递、都是实参的引用传递,以及可变参数(列表)。
同时参数也有自己的作用域(局部、全局…)不在此赘述

  • 解释器会查看对象引用(内存地址)指示值的类型,如果变量指示一个可变的值,就会按引用调用语义。如果所指示的数据的类型是不可变的,则会应用按值调用语义。这里的类型是属于对象的,而不是变量。而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。

    • 列表 字典 集合
      总是会按引用传入函数,函数代码组中对变量数据结构的任何改变都会反映到调用代码中。

    • 字符串 整数 元组
      总是会按值传入函数,函数中对变量的任何修改是这个函数私有的,不会反映到调用代码中。
      在这里插入图片描述

  • 可选参数
    函数中可以对形参设置缺省值(默认值),此时传参若未对该位置参数传输数据,函数内使用该参数时使用缺省值。

    • 默认参数必须出现在函数参数列表的最右端,且任何一个默认参数右边不能非默认参数。如下都是错误的声明方式在这里插入图片描述
  • 可变数量参数
    函数定义时可以设计可变数量参数,既不确定参数总数量,例如在这里插入图片描述
    可利用诸如for循环之类的方法,动态访问该元组。

tips:命名参数(不推荐使用)

在函数调用时,可以通过形参名字指定传入的形参。通过命名参数,实参顺序可以和形参顺序可以不一致,但不影响传递结果。如在这里插入图片描述


二、组合数据类型

组合数据类型能够将多个同类型或不同类型的数据组织起来,通过单一的表示使数据操作更有序更容易。
组合数据类型可以分为三类:序列类型、集合类型和映射类型。

在这里插入图片描述

2.1 序列类型:元组与列表

序列类型是元素之间存在先后关系,通过序号访问,元素之间不排他。当需要访问序列中某特定值时,只需要通过下标标出即可。

有趣的是,在Python中不仅可以使用正向递增序号进行索引,也可以使用反向递减序号进行索引。(如果该类型允许索引)
若一个序列len=n,正向序号0~n-1,对应的逆向序列为-n~-1

序列类型通用操作符

在这里插入图片描述
字符串类型不在此赘述,可见【Python】#2 基本数据类型

关于元组(tuple)

  • 元组是包含0个或多个元素的不可变序列类型。元组生成后是固定的,其中任何元素不能替换或删除。
  • 元组中元素可以不同
  • 元组的所有元素放在一对圆括号()(可选)中,且元素之间用逗号隔开,使用小括号或者tuple()进行元组的创建,如
    • 元组变量=数据1,数据2,……
    • 元组变量=(数据1,数据2,……)
    • 元组变量=tuple(变量名或数据)
    • 空元组只可用后两者创建

值得强调的是,当我们创建只有一个元素的元组时,最好在该元素后面加上否则会导致类型错误

  • 元组推导式,格式如下,用选取的x计算出的表达式结果作为新元组的元素
    • 表达式1 for 变量x in 可迭代对象)
    • 表达式1 for 变量x in 可迭代对象 if x满足的条件)
    • 表达式1 if 条件表达式 else 表达式2 for 变量x in 可迭代对象)

eg:

tup1=(1,2,3,4,5,6,7,8,9)
tup4=tuple(x*x if x%2==0 else x for x in tup1) 
#tup4=(1,4,3,16,5,36,7,64,9) 
  • 同时,元组支持多重索引

eg:
在这里插入图片描述


关于列表(list)

Python中列表有些类似C语言中数组,但是实际操作并不相同

  • 列表是一种序列类型,创建后可以随意被修改
  • 列表用中括号[]表示,元素间用逗号,分隔
  • 列表中各元素类型可以不同,无长度限制
  • 列表可采用标准的比较操作符(<、<=、==、!=、>=、>)进行比较,列表的比较实际上是单个数据项的(ascii码)逐个比较。
  • 建立空列表可通过[]list()函数
    • 列表变量=[数据1,数据2,……]
    • 列表变量=list(变量名或对象数据)
    • 创建空列表:list1=[]or list1=list()

除此之外,列表必须通过显式的数据赋值才能生成新的对象,简单将一个列表赋值给另一个列表不会生成新的列表对象,而是类似C语言中的指针指向同一地址。如下图示:

在这里插入图片描述

  • 列表推导式
      用法类似元组,但是外部括号改为[]

  • 列表常用操作符与函数
    在这里插入图片描述

值得一提的是:
  对列表的部分值进行修改时,实际是将该部分删除后插入改变的内容,所以Python不要求改变与被改变的长度相同。
eg:
在这里插入图片描述


2.2 集合

集合是多个元素的无序组合(所以它不可以进行分片和索引),每个元素唯一,与数学中的集合概念一致
同时集合元素不可更改,不能是可变数据类型

  • 集合的所有元素放在一对大括号{}中,元素之间用逗号隔开
  • 同一集合中元素的数据类型可以不相同,且必须是数值、字符串、元组等不可变类型,不能是列表、集合和字典等可变类型
  • 建立集合类型用{}set()
    • 集合类型变量={数据1,数据2,……}
    • 集合类型变量=set(变量名或对象数据)
    • 建立空集合类型,必须使用set()不能用{}{}用来创建一个空字典

set类型的特殊操作符作用
在这里插入图片描述
set相关常用操作函数
在这里插入图片描述


2.3 字典

在Python中, 映射类型主要以字典(dict)体现。映射类型是“键—值”数据项的组合,每个元素是一个键值对,即元素是(key,value),元素之间是无序的。键值对(key,value)是一种二元关系。

  • 键值对:键是数据索引的扩展
  • 采用大括号{}和dict()创建
    {<键1>:<值1>, <键2>:<值2>, ……, <键n>:<值n>}
    • 键值对用冒号:表示,不同键值对通过,隔开
  • key只能是数值型、字符串和元组等不可变类型;字典是通过键来存取元素的。因此,同一个字典中,键必须是唯一的
  • 需要注意的是,对字典变量进行的通用操作和函数默认以key为对象的。如果需要对value进行相应的操作需要使用dict.value()。
  • 字典的一些内置函数

在这里插入图片描述


一些小实验

猜数字函数调用

def GuessSecret(Max_times,min,max):
    secret = random.randint(min, max)
    times=0
    print("-----游戏开始-----")
    while (Max_times):
        try:
            guess = eval(input(f"@数字区间{min}-{max},请输入你猜的数字:"))
            print(f"你输入数字是:{guess}")
        except NameError:
            print("格式错误,请输入一个整数!")
        else:
            if guess == secret:
                print(f"你猜了{times}次,猜对了,真厉害")
            else:
                if guess < secret:
                    min = guess
                    print(f"@数字区间{min}-{max},你猜的数字小于正确答案")
                else:
                    max = guess
                    print(f"@数字区间{min}-{max},你猜的数字大于正确答案")
            times += 1
            Max_times-=1
    print("-----游戏结束-----")

try:
    ts=eval(input("@请输入猜数字的最大次数:"))
    min=eval(input("请输入猜测数字的最小值:"))
    max=eval(input("请输入猜测数字的最大值:"))
except NameError:
    print("格式错误,请输入一个整数!")
else:
    GuessSecret(ts,min,max)

运行测试如图
在这里插入图片描述

lambda函数使用

利用 lambda 函数比较两个输入的大小,并利用 datetime 库按照如下格式显示当前时间

import datetime as dt

x=eval(input("请输入x的值:"))
y=eval(input("请输入y的值:"))
bigger=lambda x,y:x if(x>=y) else y
print(f"两个输入中较大的是{bigger(x,y)}")
now=dt.datetime.today()
print(f"当前的时间{now.year}{now.month}{now.day}日")

测试
在这里插入图片描述

递归法绘制科赫曲线

import turtle as t
def koch(size, n):
    if n==0:
        t.fd(size)
    else:
        for angle in [0,60,-120,60]:
            t.left(angle)
            koch(size/3,n-1)

t.setup(1000,1000)
t.pen(speed = 0, pendown = False, pencolor = 'blue')
a,n=400,4
t.goto(-a/2,a/2/pow(3,0.5))
t.pd()
for i in range(3):
    koch(a,n)
    t.right(120)
t.ht()
t.done()

在这里插入图片描述

石头剪刀布

import random
#定义手势类型
allList = ['石头','剪刀','布']
#定义获胜的情况
winList =[['石头','剪刀'],['剪刀','布'],['布','石头']]#用户输入
chnum=-1
prompt ='''===欢迎参加石头剪刀布游戏===
请选择:0 石头; 1 剪刀; 2 布; 3 我不想玩了
请选择对应的数字:'''
while True:
    chnum= input (prompt)
    if chnum not in ['0','1','2','3']:
        print("无效的选择,请选择 0/1/2/3")
        continue
    if chnum== '3':
        break
    cchoice = random. choice(allList)
    uchoice = allList[int (chnum)]
    print(f"您选择了: {uchoice},计算机选择了: {cchoice}")
    if uchoice==cchoice:
        print("tie-game")
    elif [uchoice,cchoice] in winList:
        print("you win")
    else:
        print("you lose")
print("Game Over")

运行测试
在这里插入图片描述


筛选法求素数

筛选法求[2,n]范围内全部素数的基本思路是:在2~n中划去2的倍数(不包括2),再划去3的倍数(不包括3),由于4已被划去,再找5的倍数,……,直到划去不超过n的倍数,剩下的数都是素数。

from math import *
n=int(input("请输入n:"))
m=int(sqrt(n))
p=[i for i in range(n+1)]
for i in range(2,m+1):
    if p[i]:
        for j in range(2*i,n+1,i):
            p[j]=0
for i in range(2,n+1):
    if p[i]:
        print(p[i])

测试如图:
在这里插入图片描述

相关推荐

  1. Python组合数据类型

    2024-04-26 03:32:05       26 阅读
  2. 小学信息科技Python课程第4课:数据类型转换

    2024-04-26 03:32:05       38 阅读
  3. Python语言零基础入门——组合数据类型(一)

    2024-04-26 03:32:05       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-26 03:32:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-26 03:32:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-26 03:32:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-26 03:32:05       20 阅读

热门阅读

  1. 0053__Linux----tr命令详细使用方法

    2024-04-26 03:32:05       8 阅读
  2. Linux下文件内容更新了文件夹时间戳却没变?

    2024-04-26 03:32:05       12 阅读
  3. Spring中事务的几种失效场景

    2024-04-26 03:32:05       12 阅读
  4. 如何看待AIGC技术?【模板】

    2024-04-26 03:32:05       12 阅读
  5. json字符串转json对象三种方式

    2024-04-26 03:32:05       13 阅读
  6. 期货开户利润是风险的产物

    2024-04-26 03:32:05       11 阅读
  7. C# 通过阿里云 API 实现企业营业执照OCR识别

    2024-04-26 03:32:05       12 阅读