打开文件的方式
# 第一种
f = open('C:\project\pycharmprojects\\bigdata33\day05/cars.csv', mode='r', encoding='UTF-8')
text = f.read()
print(text)
f.close()
# 第二种
text = ''
with open('C:\project\pycharmprojects\\bigdata33\day05/cars.csv', mode='r', encoding='UTF-8') as f:
text = f.read()
#
# text = f.read() # f出了with就会被close掉
print(text)

函数

引言:比如植物大战僵尸,这个游戏本身也是由代码编写,现在假设有一种豌豆射手,每发射一次

炮弹会执行100行逻辑代码

如果我在程序,每当需要发射炮弹的时候,都要编写100行逻辑代码,就会觉得该程序过于冗余,

代码重复度较高。

解决方案:

如果我将这100行代码放到一个区域中,然后给这个区域起一个名字,今后在需要发射炮弹的代码

逻辑中,通过这个名字就可以调用起这100行代码。这个区域【代码段】在python中称之为函

数,先将函数定义出来,并对该函数起一个名字,将来在合适的地方通过函数名调用该函数,执行

该函数的内部逻辑。

  • 函数格式

    # 使用python中的关键字 def
    def 函数名(...):
    函数代码逻辑
    函数使用特点
    • 函数不调用不执行

    • 定义函数必须在调用之前出现

函数的参数
  • 参数种类

    • 形式参数:指的是函数定义时,小括号中定义的参数

    • 实际参数:指的是将来调用函数时,实际传入进去的具体的值

      def fun1(hhs, zcy): # hhs zcy是形式参数,名字自定义
      print(hhs + zcy)
      a1 = int(input("请输入第一个数值:"))
      b1 = int(input("请输入第二个数值:"))
      fun1(a1,b1) # a1 b1 是实际参数,可以是变量,也可以是具体的值本身
  • 参数的传值方式

    • 位置传参

      def show1(a, b, c):
      print(f"a:{a},b:{b},c:{c}") # a:11,b:22,c:33
      show1(11, 22, 33)
    • 关键字传参 【通过形参的名字传参】

    def show1(a, b, c):
    print(f"a:{a},b:{b},c:{c}")
    show1(b=100, c=200, a=300)
    • 混合传参

      def show1(a, b, c):
      print(f"a:{a},b:{b},c:{c}")
      show1(100, c=200, b=300)

      注意: 混合传参的时候,前面没有关键字的实参是会按照形参的位置来的,后面关键字传参可

      以顺序不一样。

      函数传参的场景【扩展知识】

def send_email(msg_to, send_info):
import smtplib
from email.mime.text import MIMEText
from email.header import Header
msg_from = '1716646114@qq.com' # 发送方邮箱
passwd = 'aunxsclnyryuiggh' # 填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱密码)
# msg_to = ['','','']
subject = "数加" # 主题
# 生成一个MIMEText对象(还有一些其它参数)
msg = MIMEText(send_info)
# 放入邮件主题
msg['Subject'] = subject
# 也可以这样传参
# msg['Subject'] = Header(subject, 'utf-8')
# 放入发件人
msg['From'] = msg_from
# 放入收件人
# 通过ssl方式发送,服务器地址,端口
s = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 登录到邮箱
s.login(msg_from, passwd)
# 发送邮件:发送方,收件方,要发送的消息
s.sendmail(msg_from, msg_to, msg.as_string())
print('成功')
p = input("请输入要接收邮件的qq邮箱地址:")
info = input("请输入要发送的内容:")
send_email(p, info)
  • 默认值传参

需求:调用一个函数,传入一个大字符串和一个小字符串,查找小字符串在大字符串中出现

的次数,调用函数的时候,可以不传小字串,默认查找字符'a'在大字符串中的出现次数。

def str_number(big_str, small_str='a'): # 定义函数时,可以设置形式参数的值,作为默认值
# dadqwwfwqfjwqaoiaiosijpoaospjfqwasaapjosaja
list1 = list(big_str)
counts = list1.count(small_str)
print(f"{small_str}在大字符串中总共出现了{counts}次。。。") str_number('dadqwwfwqfjwqaoiaiosijpoaospjfqwasaapjosaja') # 调用时若不传入第二个参数,使用的就是定义时的默认值
str_number('dadqwwfwqfjwqaoiaiosijpoaospjfqwasaapjosaja','f') # 若传入第二个参 数,使用的就是实际传入的值
  • 动态传参

    未使用动态参数时,解决需求,比较麻烦,参数需要另外定义一个函数

# 需求1:定义一个函数,将来传入两个int类型的值求和
def sum1(a, b):
print(a + b)
sum1(10, 20)
# 需求2:定义一个函数,将来传入三个int类型的值求和
def sum2(a, b, c):
print(a + b + c) sum2(10, 20, 30)

使用动态参数,只需要定义一个函数就可以了

def sum1(*num):
# 这里的num 是一个元组,接收若干个将来调用时传入的实参
n = 0
for i in num:
n = n + i
print(f"总和为:{n}")
sum1(10, 20) # (10, 20)
sum1(10, 20, 30) # (10, 20, 30)
sum1(10, 20, 30, 40) # (10, 20, 30, 40)

使用动态参数时的注意事项

传参的内容,多个参数的类型可以是不一样的

def sum1(*num):
# 这里的num 是一个元组,接收若干个将来调用时传入的实参
# n = 0
# for i in num:
# n = n + i
# print(f"总和为:{n}")
print(num, type(num))
# sum1(10, 20) # (10, 20)
# sum1(10, 20, 30) # (10, 20, 30)
# sum1(10, 20, 30, 40) # (10, 20, 30, 40)
# sum1(11) # (11,)
# sum1(11, '小虎', [11, 22, 33]) # (11, '小虎', [11, 22, 33])
sum1((11,22,33)) # ((11, 22, 33),)

传入两个**的动态参数

def sum1(**num):
print(num, type(num))
sum1(name='小虎', age=18)

结论

结论:
* : 表示传入的每一个单独的元素都被封装成一个元组
** : 表示传入的是一个一个的键值对,所有的键值对会被封装成一个字典
我们今后开发的时候,定义动态参数时,起名字是固定的,若一个*的动态参数,名字起为
*args, 若**的动态参数,名字起为**kwargs
动态参数定义的时候,必须
函数返回值

有些函数,我们调用完之后,是能够得到结果的,理论上来说,python中所有的函数都有返回值

python中提供了一个关键字给我们在函数中使用,表示调用完后返回的值,这个关键字叫做

return

def sum(a,b):
c=a+b
print(c+20)
return c
rest1=sum(20,30)
print(rest1)
  • 函数返回值的特点

    • 一个函数中如果没有写return, 默认情况下,这个函数最后一句话会有一个return None

    • return 和print的区别?

      return是调用完函数时,可以返回一个值给调用者

      print就直接输出了,没有返回值

      一个函数中,如果遇到了return,那么这个函数就结束了,函数中的后续代码不执

def fun1(a, b):
print("今天是星期二")
c = a + b
return c
print("明天自习") # 不执行
res1 = fun1(10, 20)
print(res1)
  • 一个函数里只能有一个return

    # def fun1(a, b):
    # print("今天是星期二")
    # c = a + b
    # return c
    # print("明天自习") # 不执行
    # return 100 # 无效代码
    # res1 = fun1(10, 20)
    # print(res1)
    def fun1():
    for i in range(1,11):
    return i
    res1 = fun1()
    print(res1) # 1
  • 函数返回值return后面,要返回的类型可以是任意的类型

  • 函数参数和返回值的练习

  • 定义 两个函数,第一个函数用户循环输入要累加的数值,函数内部将用户输入的值封装成一

    个列表返回;第二个函数将第一个函数返回的列表当作参数传入,返回列表中所有数据之和的

    结果。

def get_list():
list1 = []
while True:
n = int(input("请输入一个数值:"))
if n == -1:
break
list1.append(n)
return list1 def sum_list(l2):
n = 0
for i in l2:
n += i
return n
l1 = get_list()
print(l1)
res2 = sum_list(l1)
print(res2)
  • 函数返回值的的一些进阶用法

    • 直接返回多个值,多个值之间使用英文逗号分隔,实际返回的内容是一个元组
def show1():
return 11, 22, 33
res1 = show1()
print(res1, type(res1))
  • 分别接收每个返回元素的值

    # def show1():
    # return 11, 22, 33
    # a1, a2, a3 = show1()
    # print(f"a1:{a1}")
    # print(f"a2:{a2}")
    # print(f"a3:{a3}")
    def show1():
    return 11, ['hello','world','python'], 33
    a1, a2, a3 = show1()
    print(f"a1:{a1}") # a1:11
    print(f"a2:{a2}") # a2:['hello', 'world', 'python']
    print(f"a3:{a3}") # a3:33
函数的分类
  • 无参无返回值
def login():
# 登录的操作逻辑
login()
  • 无参有返回值
def get_number():
# 随机生成一个数
return num
n = get_number()
print(n)
  • 有参无返回值

    def sum1(a,b):
    print(a+b)
    sum1(10,20)
  • 有参有返回值

     def fun1(s1):
    # return "shujia:" + s1
    # res1 = fun1('hello')
    # print(res1)
函数可以进行嵌套
  • 嵌套调用

    def fun1():
    print("hello world 1")
    def fun2():
    return 100
    def fun3(a1, b1):
    fun1() # 调用fun1函数
    res1 = fun2() # 调用fun2函数
    return a1 + b1 + res1
    res2 = fun3(11,22)
    print(res2)
  • 嵌套定义

def fun1():
a = 10
def fun2():
print("hello world")
print(a)
fun2() # 不调用 不执行
fun1()
# fun2() # 报错,调用不了函数内部定义的函数
  • 函数练习2:定义一个函数,传入一个文本路径,和一个关键词,将文本中包含关键词的那一句话

    拿出来放在一个列表中返回该列表

import os
def get_word_list(file_os, word):
res_list = []
if os.path.exists(file_os):
f = open(file_os, 'r', encoding='UTF-8')
line_list = f.readlines()
for line in line_list:
if word in line:
res_list.append(line.strip())
else:
print("该路径不存在!!")
return res_list
list1 = get_word_list('data/words.txt', 'shujia')
print(list1) def get_word_list(file_os, word):
res_list = []
if not os.path.exists(file_os):
print("该路径不存在!!")
return res_list
f = open(file_os, 'r', encoding='UTF-8')
line_list = f.readlines()
for line in line_list:
if word in line:
res_list.append(line.strip())
return res_list
list1 = get_word_list('data/words.txt', 'shujia')
print(list1)
函数的传值问题

在python中,调用函数时,传入的是对象的引用。

不可变对象【str, int, float, bool】

def fun1(x, y):
print(f"x:{x}, y:{y}") # x:hello, y:world
x = y
x = x + x
print(f"x:{x}, y:{y}") # x:worldworld, y:world
s1 = "hello"
s2 = "world"
print(f"s1:{s1}, s2:{s2}") # s1:hello, s2:world
fun1(s1,s2)
print(f"s1:{s1}, s2:{s2}") # s1:hello, s2:world

![image-20241126211317574](D:\soft\Typora\python基础 .assets\image-20241126211317574.png)

不可变对象:指的是函数内的操作不会影响到函数外的变量值

  • 可变对象【list, tuple, dict, set, 类】

    def fun1(x, y):
    print(f"x:{x}, y:{y}") # x:['hello'], y:['world']
    x = y
    x.append('java')
    print(f"x:{x}, y:{y}") # x:['world','java'], y:['world','java']
    s1 = ['hello']
    s2 = ['world']
    print(f"s1:{s1}, s2:{s2}") # s1:['hello'] , s2:['world']
    fun1(s1,s2)
    print(f"s1:{s1}, s2:{s2}") # s1:['hello'], s2:['world', 'java']

    ![image-20241126212958872](D:\soft\Typora\python基础 .assets\image-20241126212958872.png)

可变对象函数内部可以进行操作,改变可变对象中存储的值,间接影响到函数外变量的引用

作用域和变量
  • 在python中,作用域分为两个区域

    • 函数外是一个作用域
    • 函数内部是一个作用域
  • 全局变量:将变量定义在函数外

  • 局部变量:将变量定义在函数内部

  • 全局变量和局部变量使用特点

    • 局部作用域中可以使用到全局变量【可以使用函数外部定义的变量】
    • 函数与函数内部的作用域是相互独立的,不能互相调用函数内部创建的局部变量
if 1==1:
a=10
print(f"a:{a}")
for i in range(11):
pass
print(f"i:{i}")
  • python中提供了一个关键字 global, 在函数内部定义一个全局变量,出了函数也是可以被访问到

    的。

    def fun1():
    global a
    a = 100
    fun1()
    print(a)
进阶:函数名也可以当作一个变量使用
def fun1():
print("好好学习,天天向上!")
fun2 = fun1
fun2()

赋值的时候,注意有没有小括号,方法名直接赋值,相当于给函数另起了一个名字;如果加了小括

号,相当于调用函数的结果赋值。

  • 用法场景2:变量可以存储在容器中,比如列表

    def fun1():
    print("鹅鹅鹅")
    def fun2():
    print("曲项向天歌")
    def fun3():
    print("白毛浮绿水")
    def fun4():
    print("红掌拨清波")
    fun_list = [fun1, fun2, fun3, fun4]
    flag = input("请输入开始:")
    for i in fun_list:
    i()
  • 用法场景:将函数作为返回值使用

    def fun1():
    print("鹅鹅鹅")
    def fun2():
    print("曲项向天歌")
    def fun3():
    print("白毛浮绿水")
    def fun4():
    print("红掌拨清波")
    fun_list = [fun1, fun2, fun3, fun4]
    def show1():
    for i in fun_list:
    i()
    def function1():
    return show1
    res1 = function1()
    res1()
  • 用法场景4:将函数作为参数传递

    def fun1():
    print("鹅鹅鹅")
    def fun2():
    print("曲项向天歌")
    def fun3():
    print("白毛浮绿水")
    def fun4():
    print("红掌拨清波")
    fun_list = [fun1, fun2, fun3, fun4]
    def show1():
    for i in fun_list:
    i()
    def function1(s):
    s()
    function1(show1)

python基础学习4的更多相关文章

  1. Day1 Python基础学习

    一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...

  2. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  3. Day1 Python基础学习——概述、基本数据类型、流程控制

    一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...

  4. Python 基础学习 总结篇

    Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...

  5. (一)python基础学习

    根据廖雪峰老师的python教程写一些学习总结! Python基础学习 1.使用list和tuple (1)list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时 ...

  6. python基础学习(起步)

    目录 python基础学习(起步) 变量 常量 变量的内存管理 python垃圾回收机制 变量的其他赋值方式 今日编程小题 本人能力有限,若有偏颇之处请读者大大不吝赐教! 祝大家每天都在成长! pyt ...

  7. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  8. Python基础学习一

    Python基础学习一 1.变量与常量 变量名:大小写英文.数字.下划线的组合,数字不能开头 常量名:习惯上常量用大写字母命名,例如"PI" 2.多行输出 转义符:反斜杠(),如果 ...

  9. Python基础学习五

    Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...

  10. Python基础学习四

    Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...

随机推荐

  1. typescript 编译报错 不能用于索引类型

    Element implicitly has an 'any' type because expression of type 'any' can't be used to index type 't ...

  2. RK3568,字符设备框架:管理同主设备号、不同次设备号设备

    字符设备框架:管理同主设备号.不同次设备号设备 以下代码针对迅为开发板RK3568,开发板系统是ubuntu20.04, 正文 以下是我写的字符设备框架,实现了管理同主设备号.不同次设备号的功能. 代 ...

  3. 解读Karmada多云容器编排技术,加速分布式云原生应用升级

    本文分享自来源:<华为云DTSE>第五期开源专刊,作者:任洪彩 华为云高级软件工程师,Karmada社区Maintainer.   管理和协调跨多个云平台的容器化应用是当前企业面临的复杂性 ...

  4. 2023NOIP A层联测26 T2 competition

    2023NOIP A层联测26 T2 competition tjm 的做法,很抽象. 考场思路 考虑每道题被做过多少次肯定不现实,那么考虑每一道题有多少次没有做出来. 假设某一次可以做出来题 \(x ...

  5. 批量归一化(BN, Batch Normalization)

    现在的神经网络通常都特别深,在输出层向输入层传播导数的过程中,梯度很容易被激活函数或是权重以指数级的规模缩小或放大,从而产生"梯度消失"或"梯度爆炸"的现象,造 ...

  6. ArrayList removeRange方法分析

    <ArrayList原码分析>一文中提到了"为什么removeRange(int fromIndex,int toIndex)是protected的?" 先给出remo ...

  7. elementUI 表格之表头合并

    表头中有三个年份2018,2019和2020,每个年份下又有12个月份,后台返回的数据中每一个月份对应一个年份,类似下面这样 [{ year: '2018', month: '201801', }, ...

  8. Linux之EOF

    常见问题: 1.在EOF中存在特殊字符,例如$ 导致后面的无法识别, 因为默认会对变量自动替换 使用引号处理 cat >> a.sh << "EOF" ec ...

  9. 【金TECH频道】从第一性原理出发,数字原生银行原来可以这样做

    ​ "第一性原理",是最近商界特别流行的一个词. 这个来自于古希腊先贤的古老词汇,本意在于更多聚焦于事物本质,即是用物理学的角度来看待世界,一层层拨开事物表象,看到里面的本质,再从 ...

  10. 【原创】xenomai环境下开源实时数控系统LinuxCNC编译安装

    linuxcnc 在xenomai下的构建简单记录,参考链接https://www.linuxcnc.org/docs/devel/html/code/building-linuxcnc.html 1 ...