Python函数

1.函数

1.1 函数概述

  • 函数定义和优势
    • 不同形状正方形打印
# 2个
for i in range(0, 2):for j in range(0, 2):print("*", end="")print()
# 3个
for i in range(0, 3):for j in range(0, 3):print("*", end="")print()
# 4个
for i in range(0, 4):for j in range(0, 4):print("*", end="")print()
  • 改写后:
# 定义函数,函数名称为print_xx
def print_xx(x):for i in range(0, x):for j in range(0, x):print("*", end="")print("")# 函数调用
print_xx(2)
print_xx(3)
print_xx(4)
  • 优点有哪些?

1.2 函数定义和调用

函数定义

image-20231204091412733

函数调用

  • 格式:函数名([参数列表])

  • 调用过程:

    1. 程序在调用函数的位置暂停执行。
    2. 将数据传递给函数参数。
    3. 执行函数体中的语句。
    4. 程序回到暂停处继续执行。

作业1:改写

  1. 改写平均数成def
  2. 改写闰年判断
# 改写平均数练习,要求是三个数字的平均数
# 定义求平均数的函数
def avg_input(x, y, z):avg = (x + y + z) / 3print(f"平均数是:{avg}")# 定义判断闰年的函数
def judge_rn(year):# 1.能被400整除if year % 400 == 0:print(f"{year}是闰年")# 2.能被4整除但不能被100整除elif year % 4 == 0 and year % 100 != 0:print(f"{year}是闰年")else:print(f"{year}不是闰年")judge_rn(2008)
print("----------")
# 调用函数
avg_input(1, 2, 3)
print("----------")
# a = eval(input("a="))
# b = eval(input("b="))
# c = eval(input("c="))
# avg_input(a, b, c)

1.3 参数传递

  • 形参:定义函数时的参数
  • 实参:调用函数时使用的参数
  • 参数传递:实参——>形参

位置参数传递:

  • 概念:第一个实参传递给第一个形参,将第二个实参传递给第二个形参

image-20231204094635629

关键字参数传递:

  • 概念:调用函数(形参=实参)形式

image-20231204094714463

默认参数传递:

  • 默认参数:指的是形参的默认值

image-20231204095023341

参数的打包与解包

打包
  • 函数在定义时无法确定需要接收多少个数据,那么可以在定义函数时为形参添加“”或“**”:

    • *—— 接收以元组形式打包的多个值

    • #定义
      def test(*args):print(args)
      #调用
      test(11, 22, 33, 44, 55)
      #结果
      #(11, 22, 33, 44, 55)
      
    • **—— 接收以字典形式打包的多个值

    • #定义
      def test(**kwargs):print(kwargs)
      #调用
      test(a=11, b=22, c=33, d=44, e=55)
      #结果
      #{'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
      
解包
  • 实参是元组 → 可以使用“*”拆分成多个值 → 按位置参数传给形参

  • 形参已经知道有多少个参数

    • #定义
      def test(a, b, c, d, e):print(a, b, c, d, e)
      #调用
      nums = (11, 22, 33, 44, 55)
      test(*nums)
      #结果
      #{'a': 11, 'b': 22, 'c': 311 22 33 44 553, 'd': 44, 'e': 55}
      
  • 实参是字典 → 可以使用“**” 拆分成多个键值对 → 按关键字参数传给形参

    • #定义
      def test(a, b, c, d, e):print(a, b, c, d, e)#函数调用
      nums = {"a":11, "b":22, "c":33, "d":44, "e":55}
      test(**nums)
      #结果
      #11 22 33 44 55
      
作业2:
# 平均数:计算n个参数的平均值
# 定义函数计算平均值
def avg_input(*args):sum = 0for i in args:sum += iavg = sum / len(args)print(f"和是{sum},有{len(args)}个数字,平均值是:{avg}")avg_input(1)
avg_input(1, 2)
avg_input(1, 2, 3)
avg_input(1, 2, 3, 4)
作业3:
# 从键盘一直获取数字,当输入0000退出,
# 计算之前获取的值的平均值def avg_input(mylist):sum = 0for i in mylist:sum += iavg = sum / len(mylist)print(f"和是{sum},有{len(mylist)}个数字,平均值是:{avg}")def gain_input():# 1. 从键盘一直获取数字,当输入0000退出while (True):# #int()转化为整数数字# x = int(input("请输入数字:"))x = eval(input("请输入数字:"))if x == 0000:breakelse:# list_nums.insert(0, x)list_nums.append(x)list_nums = []
gain_input()
print(list_nums)
# 2. 计算之前获取的值的平均值
avg_input(list_nums)

混合传递

  • 优先级:

    1. 优先按位置参数传递的方式。
    2. 然后按关键字参数传递的方式。
    3. 之后按默认参数传递的方式。
    4. 最后按打包传递的方式。
  • 注意事项

    在定义函数时:
    带有默认值的参数必须位于普通参数之后。
    带有“*”标识的参数必须位于带有默认值的参数之后。
    带有“**”标识的参数必须位于带有“*”标识的参数之后
    
作业4:

image-20231204112313928

1.4 函数的返回值

  • return函数:

  • # 屏蔽关键字这个功能
    def filter_key(str):# 2 使用字符串的替换功能,把要替换关键字替换为目标对象str = str.replace("山寨", "**")return str# 1 准备一个字符串
    key = "手机的山寨的!"
    # 调用过滤函数
    key = filter_key(key)
    # 3 打印替换后的结果
    print("key=", key)
    #函数定义
    def move(x, y, step):nx = x + stepny = y - stepreturn nx, ny     # 使用return语句返回多个值
    #函数调用
    result = move(100, 100, 60)  	
    print(result)
    #结果
    #(160, 40)
    
作业1:
  • 使用正则表达式完成屏蔽关键字的功能

1.5 变量作用域

  • 概念:其访问权限取决于变量定义的位置,其所处的有效范围称为变量的作用域。

1.5.1 局部变量

  • 定义位置:在函数内部

  • 特点:

    • 只能在函数内部被使用
    • 函数执行结束后,无法再进行访问
  • def test_one():number = 10    	              # 局部变量print(number) 	              # 函数内部访问局部变量
    test_one()
    print(number)     	              # 函数外部访问局部变量
    
    • 不同函数内部可以包含同名的局部变量

    • def test_one():number = 10      print(number)             # 访问test_one()函数的局部变量number
      def test_two():number = 20print(number)             # 访问test_two()函数的局部变量number
      test_one()
      test_two()
      

1.5.1 全局变量

  • 定义位置:函数外面,单独定义
number = 10         			# 全局变量
def test_one():print(number)   			# 函数内部访问全局变量
test_one()
print(number)       			# 函数外部访问全局变量
  • 特点:全局变量在函数内部只能被访问,无法直接修改
# 定义全局变量
number = 10
def test_one():numberprint(number) number += 1
test_one()
print(number)

1.5.1 关键字global和nonlocal

  • (掌握)global关键字可以将局部变量声明为全局变量
number = 10                    # 定义全局变量
def test_one():global number              # 使用global声明变量number为全局变量number += 1print(number)
test_one()
print(number)
  • (了解)nonlocal关键字:局部作用域中修改嵌套作用域中定义的变量
def test():number = 10def test_in():nonlocal numbernumber = 20test_in()print(number)
test()
作业2:
  • 练习以上PPT案例:从变量 作用域开始,到global关键字结束

1.6 实训案例

  • 角谷猜想

  • 以一个正整数n为例,如果n为偶数,就将它变为n/2,如果除后变为奇数,则将它乘3加1(即3n+1)。不断重复这样的运算,经过有限步后,必然会得到1。
    本实例要求编写代码,计算用户输入的数据按照以上规律经多少次运算后可变为1。
    
    def guess_nums(guess):i = 0  # 统计重复多少次# 2 按照规则重复进行,=1 不再重复while (guess != 1):i += 1if guess % 2 == 0:guess /= 2else:guess = 3*guess+1# 3 打印结果print(f"经过{i}次得到1")# 1 获取用户输入输入的数据
    x = eval(input("x="))
    # 调用函数
    guess_nums(x)
    
  • image-20231206082020308

# 全局变量
dict_goods = {"可口可乐": 2.5, "百事可乐": 3, "健力宝": 5}
# 展示功能def show():print("饮品自动售货机")# 展示商品for key, value in dict_goods.items():print(f"{key}:{value}元")print("输入q完成购买")# 购买功能def buy():money = 0x = input("请输入购物的商品:")# 省略步骤判断输入的商品在不在货架上# 计算金额while (x != "q"):count = eval(input("请输入购物的数量:"))# 计算金钱money += dict_goods[x] * count# 下次的购物商品x = input("请输入购物的商品:")print(f"需要支付金额{money}元")# 函数调用
show()
buy()

1.7 特殊函数

1.7.1 递归函数

  • 概念:函数自己调用自己

  • 格式:

  • image-20231206110552431

  • #阶乘案例:
    def func(num):if num == 1: return 1else:return num * func(num - 1)
    num = int(input("请输入一个整数:"))
    result = func(num)
    print("5!=%d"%result)
    

1.7.2 匿名函数

概念:

  • 关键字lambda来创建,并可以赋给一个变量供调用,没有名字的函数。

  • 用于定义简单的、能够在一行内表示的函数

示例:
sum = lambda a,b=100:a+b    #允许带默认参数
print("变量之和为:",sum(100,200))
print("变量之和为:",sum(100))#下面是等价形式:
def sum_nums(a,b=100):return a+b
print("变量之和为:",sum_nums(100,200))
print("变量之和为:",sum_nums(100))

1.7.3 特殊函数

  • map函数

    • 功能:单参数函数依次作用到一个序列对象的每个元素

    • 案例:

    • #示例:
      #定义函数sqr(x)
      def sqr(x):return x**2
      #列表
      item1=[1,2,3,4,5]
      #使用map函数
      for i in map(sqr,item1):   print(i,end=' ')
      #结果
      #1 4 9 16 25
      
  • reduce函数

  • 功能:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,以此类推,最后得到一个结果

  • from functools import reduce #需要导入模板
    def add(x,y):return x+y
    print("累加结果:",end=' ')
    print(reduce(add, [1,2,3,4]))
    #结果10
    
  • filter函数

    • 功能:,其作用是将一个单参数函数作用到一个序列上,返回该序列中使得该函数返回值为True的那些元素组成的列表、元组或字符串

    • #定义函数判断奇数
      def is_odd(n):return n%2==1
      newlist1 = filter(is_odd,range(1,11))         #通过自定义函数构造过滤器
      print("奇数序列为:",end=' ')
      for i in  newlist1:print(i,end=' ')
      #奇数序列为: 1 3 5 7 9 
      

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:dockerfile编写搭建nginx练习(8)

dockerfile是创建镜像的一种,通过已有镜像的基础上再在上面部署一些别的。 在这个基础镜像上搭建,我这个是一个空的centos镜像 我这里用http的yum仓库存放了nginx和rpm包 创建dockerfile vim Dockerfile写入#设置基础镜像 FROM centos#维护该镜像的用户…

redis------在java中操作redis

Redis(非关系型数据库)简介 redis下载 点击即可进入redis中文网进行下载 百度网盘windows版本 提取码 DMH6 redis主要特点 基于内存存储,读写性能高 适合存储热点数据(热点商品、资讯、新闻) 企业应用广泛 redis不同…

SQL Server 2016(创建数据库)

1、实验环境。 某公司有一台已经安装了SQL Server 2016的服务器,现在需要新建数据库。 2、需求描述。 创建一个名为"db_class"的数据库,数据文件和日志文件初始大小设置为10MB,启用自动增长,数据库文件存放路径为C:\db…

Gti GUI添加标签

通过Git Gui打开项目,通过菜单打开分支历史,我这里是名为"develop"的分支 选中需要打标签的commit,右键-Create tag即可 但貌似无法删除标签,只能通过git bash

linux NAT网卡配置static

由于是内网,资料无法拷贝,借助参考资料,整理发出。 镜像安装 基本操作。 查看VM配置 图1,有几个信息。一个是NAT借用了网卡里的VMnet8适配器。 子网IP是从192.168.142.0 子网掩码255.255.255.255,对应下面配置的N…

CoreDNS实战(五)-接入prometheus监控

1 背景 Prometheus插件作为coredns的Plugins,默认情况下是内置在coredns中,如果是自己编译安装的版本,需要注意在编译安装的时候的plugin.cfg文件中添加了prometheus:metrics,这样才能确保编译成功。 # 首先我们检查一下运行的版…

【从零认识ECS云服务器 | 快速上线个人网站】二、使用ECS云服务器

第二章 使用ECS 2.1 获取ECS 方式一:通过试用中心免费领取ECS实例 满足以下全部条件的阿里云用户,可免费试用云服务器ECS: 阿里云注册会员用户并完成阿里云企业认证或个人认证用户。申请用户是云服务器ECS产品的新用户,可以申…

【链表Linked List】力扣-2 两数相加

目录 题目描述 解题过程 题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 …

Vue学习计划-Vue2--Vue核心(二)Vue代理方式

Vue data中的两种方式 对象式 data:{}函数式 data(){return {} }示例&#xff1a; <body><div id"app">{{ name }} {{ age}} {{$options}}<input type"text" v-model"value"></div><script>let vm new Vue({el: …

[JavaScript前端开发及实例教程]计算器井字棋游戏的实现

计算器&#xff08;网页内实现效果&#xff09; HTML部分 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>My Calculator&l…

【头歌系统数据库实验】实验6 SQL的多表查询-2

目录 第1关&#xff1a;查询每个选手的信息及其提交的解答信息&#xff0c;没做题的选手不显示 第2关&#xff1a;查询做了1001题且耗时大于500&#xff08;time&#xff09;的选手信息 第3关&#xff1a;查询所有选手信息及其提交的解答信息&#xff0c;没做题的选手也要显…

css所有属性介绍

文章目录 1️⃣ CSS属性介绍1.1 CSS3 动画属性&#xff08;Animation&#xff09;1.2 CSS 背景属性&#xff08;Background&#xff09;1.3 CSS 边框属性&#xff08;Border 和 Outline&#xff09;1.4 Box 属性1.5 Color 属性1.6 Content for Paged Media 属性1.7 CSS 尺寸属性…

基于 Vue、Datav、Echart 框架的 “ 数据大屏项目 “,通过 Vue 组件实现数据动态刷新渲染,内部图表可实现自由替换

最近在研究大数据分析&#xff0c;基于 Vue、Datav、Echart 框架的 " 数据大屏项目 "&#xff0c;通过 Vue 组件实现数据动态刷新渲染&#xff0c;内部图表可实现自由替换。部分图表使用 DataV 自带组件&#xff0c;可进行更改&#xff0c;详情请点击下方 DataV 文档…

【全栈开发】使用NestJS、Angular和Prisma 打造全栈Typescript开发

在开发Angular应用程序时&#xff0c;我非常喜欢Typescript。使用NestJS&#xff0c;您可以以与Angular非常相似的方式编写后端。 我偶然发现了这个库&#xff0c;发现它非常有趣&#xff0c;所以我想设置一个简单的测试项目。一般来说&#xff0c;我主要使用SQL数据库&#x…

C语言给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)

这个题目要求的输出是一串数字&#xff01;&#xff01;&#xff01; 不是下面&#xff1a;输入在一行中给出 10 个非负整数&#xff0c;顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50&#xff0c;且至少拥有 1 个非…

0基础学java-day15

一、泛型 1 泛型的理解和好处 1.1 看一个需求 【不小心加入其它类型&#xff0c;会导致出现类型转换异常】 package com.hspedu.generic;import java.util.ArrayList;/*** author 林然* version 1.0*/ public class Generic01 {SuppressWarnings("all")public st…

【前端】-【electron】

文章目录 介绍electron工作流程环境搭建 electron生命周期&#xff08;app的生命周期&#xff09;窗口尺寸窗口标题自定义窗口的实现阻止窗口关闭父子及模态窗口自定义菜单 介绍 electron技术架构&#xff1a;chromium、node.js、native.apis electron工作流程 桌面应用就是…

微服务开发:断路器详解

微服务是目前业界使用的最重要的实现方面。通过使用微服务架构&#xff0c;开发人员可以消除他们以前在单体应用程序中遇到的许多问题。展望未来&#xff0c;人们开始在微服务中搜索和采用各种模式。大多数时候&#xff0c;新模式的产生是为了解决另一个模式中出现的常见问题。…

TCP协议实现一对一聊天

服务端代码&#xff1a; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;/*** 发送消息线程*/ class Send e…

Scrapy爬虫数据存储为JSON文件的解决方案

什么是JSON文件 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人们阅读和编写&#xff0c;同时也易于机器解析和生成。它基于JavaScript Spark语言的一个子集&#xff0c;但独立于Smashing语言&#xff0c;因此在许多中…