Python基础—task4

1 函数关键字

python中一共含有32个关键字:‘false’, ‘none’, ‘true’, ‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’
  --关键字-是Python内置的、具有特殊意义的表示符
  --使用时关键字后面不需要括号

2 函数的定义

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
你可以定义一个由自己想要功能的函数,以下是简单的规则:
(1)函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
(2)任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
(3)函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
(4)函数内容以冒号起始,并且缩进。
(5)return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
在这里插入图片描述

3 函数参数与作用域

传递参数

函数传递参数时的一些简要的关键点:
(1)参数的传递是通过自动将对象赋值给本地变量名来实现的。所有的参数实际上都是通过指针进行传递的,作为参数被传递的对象从来不自动拷贝。
(2)对于numbers,Strings,元祖这种不可改变值的类型,在函数内部的参数名的赋值不会影响调用者。原因就是这种类型会在改变值的时候,重新指向新地址,那么之前的对象执行地址值不会变,就等同于copy.(传递值就是传递指针的指向)
(3)改变函数的可变对象参数的值会对调用者有影响。(直接在指向地址处修改值,不再重现创建新的地址作为指向)

实际上,Python的参数传递模型和C语言的相当相似:
不可变参数”通过值”进行传递。像整数和字符串这样的对象是通过对象引用而不是拷贝进行的,但是因为不论怎么样都不可能在原处改变不可变对象,实际的效果就很像创建了一份拷贝。
可变对象是通过”指针”进行传递的。这就意味着,可变对象能够在函数内部进行原处修改。

特定的参数匹配模型

基础知识

匹配模型的大纲:
(1)位置:从左至右进行匹配。
(2)关键字参数:通过参数名进行匹配。(调用者可以定义哪一个函数接受这个(3)值,通过在调用时使用参数的变量名,使用name=value这种语法。)
(4)默认参数:为没有传入值的参数定义参数值。
(5)可变参数:搜集任意多基于位置或关键字的参数。
(6)可变参数解包:传递任意多的基于位置或关键字的参数。
(7)Keyword-only参数:参数必须按照名称传递。(只存在于Python3.0中)

匹配语法
在这里插入图片描述

Python内部是使用以下的步骤来在赋值前进行参数匹配的:
(1)通过位置分配非关键字参数。
(2)通过匹配变量名分配关键字参数。
(3)其他额外的非关键字分配到*name元组中。
(4)其他额外的关键字参数分配到**name字典中。
(5)用默认值分配给在头部未得到分配的参数。
(6)在这之后,Python会进行检测,确保每个参数只传入了一个值。如果不是这样的话,将会发生错误。当所有匹配都完成了,Python把传递给参数名的对象赋值给它们。

关键字参数

关键字参数允许通过变量名进行匹配,而不是通过位置。

f(c=3,b=2,a=1) #Ouput: 1,2,3

默认参数

默认参数允许创建函数可选的参数。如果没有传入值的话,在函数运行前,参数就被赋了默认值。

def f(a,b=2,c=3):
print(a,b,c)
f(1) #Ouput: 1,2,3
f(1,4) #Ouput: 1,4,3
f(1,c=6) #Ouput: 1,2,6

关键字参数和默认参数的混合

def func(spam,eggs,totast=0,ham=0):
print((spam,eggs,totast=0,ham=0))
func(1,2) #Ouput:(1,2,0,0)
func(1,ham=1,eggs=0) #Ouput:(1,0,0,1)
func(spam=1,eggs=0) #Ouput:(1,0,0,0)
func(toast=1,eggs=2,spam=3) #Ouput:(3,2,1,0)
func(1,2,3,4) #Ouput:(1,2,3,4)

收集参数

在函数定义中,在元组中收集不匹配的位置参数。

def f(*args):print(args)
当这个函数调用时,Python将所有位置相关的参数收集到一个新的元组中,并将这个元组赋值给变量args。因此它是一个一般的元组对象,能够进行索引或迭代。

*特性类似,但是它只对关键字参数有效。将这些关键字参数传递给一个新的字典,这个字典之后将能够通过一般的字典工具进行处理。在这种情况下允许将关键字参数转化为字典,你能够在之后使用键调用进行步进或字典迭代。

def f(a,*pargs,**kargs):print(a,pargs,kargs)
f(1,2,3,x=1,y=2) #Ouput:1 (2,3) {‘x’:2,‘y’:1}

解包参数

在最新的Python版本中,我们在调用函数时能够使用*语法。在这种情况下,它与函数定义的意思相反。它会解包参数的集合,而不是创建参数的集合。

def func(a,b,c,d):print(a,b,c,d)
args=(1,2)
args+=(3,4)
func(*args) #Ouput:1,2,3,4

**相似的,在函数调用时,会以键/值对的形式解包一个字典,使其成为独立的关键字参数。

args={‘a’:1,‘b’:2,‘c’:3}
args[‘d’]=4
func(**args) #Ouput:1,2,3,4

注意:别混淆函数头部和函数调用时*/**的语法:在头部,它意味着收集任意多的参数,而在调用时,它解包任意数量的参数。

python作用域

在一个Python程序只用变量名时,Python创建、改变或查找变量名都是在所谓的命名空间(一个保存变量名的地方)中进行的。也就是说,在代码中变量名被赋值的位置决定了这个变量名能被访问到的范围,也即决定了它存在于哪个命名空间中。
1.一个在def内的定义的变量能够在def内的代码使用,不能在函数的外部应用这样的变量名。
2.def之中的变量名与def之外的变量名并不冲突,一个在def之外被赋值的变量X与在这个def之中赋值的变量X是完全不同的变量。

作用域法则:

在开始编写函数之前,我们编写的所有代码都是位于一个模块的顶层(也就是说,并不是嵌套在def之中),所以我们使用的变量名要么是存在于模块文件本身,要么就是Python内置预先定义好的。函数定义本地作用域,而模块定义的全局作用域。这两个作用域有如下关系:
(1)内嵌的模块是全局作用域 每个模块都是一个全局作用域(也就是说,一个创建于模块文件顶层的变量的命名空间)。对于模块外部来说,该模块的全局变量就成为了这个模块对象的属性,但是在这个模块中能够像简单的变量一样使用。
(2)全局作用域的作用范围仅限于单个文件 这里的全局指的是在一个文件的顶层的变量名仅对于这个文件内部的代码而言是全局的。在Python中是没有基于一个单个的、无所不包的情景文件的全局作用域的。
(3)每次对函数的调用都创建了一个新的本地作用域
(4)赋值的变量名除非声明为全局变量或非局部变量,否则均为局部变量
(5)所有的变量名都可以归纳为本地、全局或者内置的

变量名解析:LEGB原则
Python的变量名解析机制有时称为LEGB法则,当在函数中使用未认证的变量名时,Python搜索4个作用域:
1.本地作用域(L)
2.上一层结构中def或lambda的本地作用域(E)(其实就是函数嵌套的情况)
注:作用域和嵌套函数
对于一个函数来说:
一个引用(X)首先在本地(函数内)作用域查找变量名X;之后会在代码的语法上嵌套了的函数中的本地作用域,从内到外查找;之后查找当前的全局作用域(模块文件);最后在内置作用域内(模块builtin)。全局声明将会直接从全局(模块文件)作用域进行搜索。其实就是从引用X的地方开始,一层一层网上搜索,直到找到的第一个X。
在默认情况下,一个赋值(X=value)创建或修改了变量名X的当前作用域。如果X在函数内部声明为全局变量,它将会创建或改变变量名X为整个模块的作用域。另一方面,如果X在函数内部声明为nonlocal,赋值会修改最近的嵌套函数的本地作用域中的名称X。

嵌套作用域举例
X = 99
def f1():
X = 88
def f2():
print(X)
f2()
f1() #Prints 88:enclosing def local
首先需要说明的是,上面这段代码是合法的,def是一个简单的执行语句,可以出现在任意其他语句能够出现的地方,包括嵌套在另一个def之中。代码中,f2是在f1中定义的函数,在此情况下,f2是一个临时函数,仅在f1内部执行的过程中存在(并且只对f1中的代码可见)。通过LEGB查找法则,f2内的X自动映射到了f1的X。
PS:值得注意的是,这个嵌套作用域查找在嵌套的函数已经返回后也是有效的。

3.全局作用域(G)
4.最后是内置作用域(B)

4 函数返回值

return语句
return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:
在这里插入图片描述

返回多个值
函数可以返回多个值:
在这里插入图片描述

5 File

5.1 打开文件方式(读写两种方式)

读文件

使用 open 函数或者 file 函数来读文件,使用文件名的字符串作为输入参数:

f = open(‘test.txt’)
f = file(‘test.txt’)
这两种方式没有太大区别。

默认以读的方式打开文件,如果文件不存在会报错。可以使用 read 方法来读入文件中的所有内容:

text = f.read()
print (text)

也可以按照行读入内容,readlines 方法返回一个列表,每个元素代表文件中每一行的内容:

f = open(‘test.txt’)
lines = f.readlines()
print (lines)

使用完文件之后,需要将文件关闭:

f.close()

事实上,我们可以将 f 放在一个循环中,得到它每一行的内容:

f = open(‘test.txt’)
for line in f:
print line
f.close()

删除刚才创建的文件:

import os
os.remove(‘test.txt’)

写文件

我们使用 open 函数的写入模式来写文件:

f = open(‘myfile.txt’, ‘w’)
f.write(‘hello world!’)
f.close()

使用 w 模式时,如果文件不存在会被创建,我们可以查看是否真的写入成功:

print open(‘myfile.txt’).read()
output: hello world!

如果文件已经存在, w 模式会覆盖之前写的所有内容:

f = open(‘myfile.txt’, ‘w’)
f.write(‘another hello world!’)
f.close()
print open(‘myfile.txt’).read()
output: another hello world!

除了写入模式,还有追加模式 a ,追加模式不会覆盖之前已经写入的内容,而是在之后继续写入:

f = open(‘myfile.txt’, ‘a’)
f.write(’… and more’)
f.close()
print open(‘myfile.txt’).read()
output: another hello world!.. and more

写入结束之后一定要将文件关闭,否则可能出现内容没有完全写入文件中的情况。
还可以使用读写模式 w+:

f = open(‘myfile.txt’, ‘w+’)
f.write(‘hello world!’)
f.seek(6)
print f.read()
f.close()
output: world!
这里 f.seek(6) 移动到文件的第6个字符处(跳过空字符),然后 f.read() 读出剩下的内容。

5.2 文件对象的操作方法

以上已给出具体的示例,尽在此时做一个总结。file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
在这里插入图片描述

5.3 学习对Excel及CSV文件进行操作

1. Python对Excel文件进行操作
Python对Excel的读写主要有xlrd、xlwt、xlutils、openpyxl、xlsxwriter几种。
参考链接:
https://www.jianshu.com/p/47e9688ee3c7 (简书官网介绍)
https://www.cnblogs.com/superxuezhazha/p/6128688.html (具体示例)
https://www.cnblogs.com/Dracular/p/8353821.html (简单对比)

xlrd主要是用来读取excel文件

在这里插入图片描述

xlwt主要是用来写excel文件

在这里插入图片描述

xlutils结合xlrd可以达到修改excel文件目的

在这里插入图片描述

2. Python对CSV文件进行操作
标准库中有自带的 csv (逗号分隔值) 模块处理 csv 格式的文件
import csv
参考链接:
http://c.biancheng.net/view/2734.html (具体示例)

读文件

在这里插入图片描述

写文件

在这里插入图片描述

更换分隔符
默认情况下,csv 模块默认 csv 文件都是由 excel 产生的,实际中可能会遇到这样的问题:
在这里插入图片描述
可以修改分隔符来处理这组数据:
在这里插入图片描述
其他选项
numpy.loadtxt() 和 pandas.read_csv() 可以用来读写包含很多数值数据的 csv 文件:
在这里插入图片描述
使用 pandas 进行处理,生成一个 DataFrame 对象:
在这里插入图片描述
通过名字进行索引:
在这里插入图片描述

6 Os模块

os 模块提供了对系统文件进行操作的方法:
import os

文件路径操作

在这里插入图片描述

当前操作系统的换行符:

在这里插入图片描述

其他
os.environ 是一个存储所有环境变量的值的字典,可以修改。

在这里插入图片描述

不同的操作系统使用不同的路径规范,这样当我们在不同的操作系统下进行操作时,可能会带来一定的麻烦,而 os.path 模块可以解决。

import os.path

测试

在这里插入图片描述

split 和 join

在这里插入图片描述

其他

在这里插入图片描述

7 Datetime模块

datetime模块用于是date和time模块的合集,datetime有两个常量,MAXYEAR和MINYEAR,分别是9999和1.

datetime模块定义了5个类,分别是

1.datetime.date:表示日期的类
2.datetime.datetime:表示日期时间的类
3.datetime.time:表示时间的类
4.datetime.timedelta:表示时间间隔,即两个时间点的间隔
5.datetime.tzinfo:时区的相关信息

参考链接:
https://blog.csdn.net/cmzsteven/article/details/64906245 (详解、示例)

datetime 提供了基础时间和日期的处理。
import datetime as dt

date 对象

可以使用 date(year, month, day) 产生一个 date 对象:

在这里插入图片描述

time 对象

可以使用 time(hour, min, sec, us) 产生一个 time 对象:

在这里插入图片描述

datetime 对象

可以使用 datetime(year, month, day, hr, min, sec, us) 来创建一个 datetime 对象。
获得当前时间:

在这里插入图片描述

datetime 格式字符表
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值