python函数学习(5)
1)一个函数,不管是否有return,它都有返回值的,如果没有return,它的返回值是None
2)如果有return,函数的返回值是return后面的内容,切记:return后面的代码是不能够执行的。
3)函数返回值的价值是:把函数与函数能够建立一层关联关系。
登录互联网产品之后,会创建一个sessionid,如果sessionid与登录的该账户的sessionid一致就会显示个人主页面。
def zhihulogin(username='lm',password='admin'): #登录知乎,账号和秘密已定义 if username=='lm' and password=='admin': return 'we456ertre' else: return'账户或密码错误' def profile(session_id): #定义另一个函数 if session_id=='we456ertre': #如果session-id与登录的session_id一致
print('欢迎查看知乎主页')
else:
print('请登录')
profile(session_id=zhihulogin())
2.内部函数
1.chr数字转字母,数字范围是97-122,对应26个字母,其他出现的是特殊字符
ord字母转数字
例如:range(1,5)输出的就是1,2,3,4
range(4),输出的就是0,1,2,3
3.内部库,随机输出一个数字
库都是需要导入的,导入的关键字的import,random随机的
实例:验证码是如何随机生成的?
import random #导入数字 list1=[] #新建一个列表list1 for i in range(4): #循环输出4个数字 r=random.randrange(97,120) #r随机生成1个数字 list1.append(chr(r)) #将随机生成的4个数字转为字母,放进列表list1中 print(''.join(list1)) #输出,将列表转为字符串
5.lambda:匿名函数
指的是它是一个函数,但是这个函数的名称可以是自定义的
普通方式过滤出列表中大于2的数字
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2=[]
def func():
for item in list1:
if item>2:
list2.append(item)
print(list2)
func()
使用过滤函数filter()
1.函数对象,但是没有()
2.可迭代的对象(可以被循环)
print(list(filter(func,list1)))#过滤出List1中大于2的数字
print(list(filter(lambda x:x>2,list1)))#使用lambda函数自定义,list强制数据转换
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def func(a):#定义一个函数,函数的形参为a if a>2: #如果a>2 return True #则结果为对 print(list(filter(func,list1))) #输出过滤之后list1中的数字 print(list(filter(lambda x:x>2,list1))) #第2种方法使用过滤函数filter和lambda函数自定义相结合,list是强制数据转换
7.map:针对所有对象做同样的操作
1.函数对象
以下还是常规操作和使用map函数的对比
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] list2=[] def func(): for item in list1: list2.append(item+10) print(list2) func() print( list(map(lambda a:a+10,list1)) )
8.Python format 格式化函数
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
print("网站名:{name}, 地址 {url}".format(name="淘宝", url="www.taobao.com")) # 通过字典设置参数 site = {"name": "lm", "age": "20"} print("姓名:{name}, 年龄 {age}".format(**site))
函数案例实战:
使用函数模拟注册,登录,进入主页面,退出四个步骤操作
import json #导入json函数 import sys #导入sys函数 class Stack(object):#定义一个类 def out(self): username = input('请输入账户:\n') password = input('请输入密码:\n') return username, password def register(self):#注册 username,password=self.out() temp=username+','+password json.dump(temp,open('data.txt','w')) #将username和password写进data.txt文档中
def login(self):#登录 username,password=self.out() # with open('data.txt', 'r') as f: # lists=f.read().split(',') lists=str(json.load(open('data.txt','r'))).split(',')#使用json将文件反序列化读取 if username==lists[0] and password==lists[1]: #如果username等于lists列表当中的第一个元素,password等于lists列表中的第二个元素 return'登陆成功' else: return'请输入正确的用户名和密码' def profile(self):#查看个人主页 with open('data.txt','r')as f: lists=f.read().split(',') print('欢迎{0}访问主页'.format(lists[0].replace('"',''))) def exit(self):#退出 sys.exit(1) def main(self): while True: try: f=int(input('1.注册 2.登录 3.主页 4.退出\n')) if f==1: self.register() elif f==2: print(self.login()) elif f==3: self.profile() elif f==4: self.exit() else:continue except Exception as e:continue if __name__ == '__main__':#统一函数执行入口 obj=Stack() obj.main()
优先级:
1.在python文件中,调用变量,全局变量优于局部变量
2.在函数内部调用变量,局部变量的优先级高于全局变量
3.如果在函数内部想引用全局变量,那么使用的关键字是global
异常的父类是BaseException
try:
expect:
else:
finally:
异常顺序:
1.正常逻辑:try-->else-->finally
2.异常逻辑:try-->except-->finally
异常逻辑,expect捕获异常,打印输出异常结果,如果程序中写了两个except,只有一个错误,则打印输出第一个捕获到的错误信息
e.args[0]是原生代码,可以自行修改和定义,例如”分母不能为0“
正常逻辑:
实例:学生成绩只能输入数字,输入字母就会报错,使用异常处理改造之后程序都可以正常运行
输出结果:
5.模块和包
1.在python中,每一个Python文件都是一个模块(module)
2.包:在一个包里面有很多的模块
3.包与文件夹的区别:包是Python package里面有 _ init _.py文件,文件夹没有
例如 在testDev里创建一个login的包:(包的图标有个洞,文件夹没有)
文件夹:Directory
一个模块调用另外一个模块文件的变量以及函数
from packages.module import *(代表所有)
首先创建一个login的包,在login的包下创建一个模块f1.py,
再从另外一个模块导入之前的模块里的内容