python 全栈开发笔记 2
函数
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象:对函数进行分类和封装,让开发“更快更好更强...”
函数式编程最重要的是增强代码的重用性和可读性
def xx():
print('xx') # 定义函数,放入内存当中,并不立即执行 #执行函数
xx() #调用函数,这时内存中的函数才开始执行,输出XX
函数的定义主要有如下要点:
- def:表示函数的关键字
- 函数名:函数的名称,日后根据函数名调用函数
- 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
- 参数:为函数体提供数据
- 返回值:当函数执行完毕后,可以给调用者返回数据。
返回值
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
参数
函数的有三中不同的参数:
- 普通参数
- 默认参数:有默认参数一定要放在后面
- 动态参数
形参,实参(默认,按照顺序)
指定形参传入实参,可以不按照顺序
动态参数
#动态参数 一个星号
def f1(*a):
print(a,type(a))
li=[1,2,3,4]
f1(li) # 输出 ([1, 2, 3, 4],) <class 'tuple'> 输出元组会将列表当成一个元素
f1(*li) # 输出 (1, 2, 3, 4) <class 'tuple'> 输出元组会将列表的每一个元素当成元组的每一个元素
f1(123)
f1(123,[4,5,6],{'k1':'43n'},(1,2,3),{1,2,3}) #可传任意多的参数,而且还可以时不同类型的参数
#返回的是元组的类型 #动态参数 两个星号
def f2(**a):
print(a,type(a))
f2(k1=123,k2=456)
#输出 {'k1': 123, 'k2': 456} <class 'dict'>
f2(k1=123,k2=456,k3=1212)
#输出 {'k1': 123, 'k2': 456, 'k3': 1212} <class 'dict'>
# 返回的是字典类型,默认输出以键值对的形式
dic={'k1':123} # 也可以将字典直接传进去
f2(**dic) # 但需要再在前面加入两个星号,否则必须要f2(k1=dic) 形式传入
f2(k1=dic)
# 上面的两条调用的输出结果分别为
# {'k1': 123} <class 'dict'> # 这样可以避免引入额外的参数 'k1='
# {'k1': {'k1': 123}} <class 'dict'> #各种参数组合起来
def f3(p,k1=23,*a,**aa):
print(p,type(p))
print(k1,type(k1))
print(a,type(a))
print(aa,type(aa))
f3(11,22,33,44,[00,55,66],k2=456,k3=000) ''' 输出结果为:11 <class 'int'> p接收
22 <class 'int'> 给k1传了值,所以k1的默认值将会被改变
(33, 44, [0, 55, 66]) <class 'tuple'> *a 接收住
{'k2': 456, 'k3': 0} <class 'dict'> **a接收
'''
局部变量和全局变量
在函数内部 修改和找到全局变量 要用关键字声明 global(变量) ,全局变量都大写,局部变量都小写
lambda 表达式
f2=lambda : 123 函数的另一种表达方式 ,函数名f2就是个变量
def f3(a1,a2):
return a1+a2 f3=lambda a1,a2:a1+a2 # 对于简单的函数,用一个简单的一句话就能表示
python 内置函数
# all() 循环参数,如果每个参数都为真,那么all的返回值为真
print(all([True,False,True])) # 输出False
print(all([True,True,True])) #输出True
# 0,None,空值都为假的,其他都为真的 # any() 只要一个为真即为真
print(any([True,False,True])) # 输出True #ascii(对象) 对象的类中找__repr__,获取其返回值 # bin()二进制 hex()十六进制 oct()八进制 int ()十进制
print(int('0b11',base=2)) # 二进制转化为十进制
print(int('0o11',base=8)) # 八进制转化为十进制
print(int('0x11',base=16)) # 十六进制转化为十进制 #bytes 字节 bytearray (字节列表)
#chr(数字)找到数字对应ascii码 ord(ascii码) 找到ascii码所对应的数字
# 例子 随机验证码
import random
temp=''
for i in range(6):
num1=random.randrange(0,4)
if num1==3 or num1 == 1:
red2=random.randrange(0,10)
temp += str(red2)
else:
red1=random.randrange(65,91)
c=chr(red1)
temp += c
print('验证码:',temp) # callable(f1) 判断f1()是不是可执行的 ,是返回True
#compile() 编译 complex() 复数 dir() 查看对象的方法
# divmod()
print(divmod(10,3)) # 输出(3,1) 商和余数
# eval() exec()
print(eval('1+3')) #输出4
exec('for i in range(10):print(i)') #将字符串当成python代码执行,没有返回值 # filter(函数,可迭代的对象) 筛选元素
def f1(x): #筛选偶数
if x%2 == 0:
return True
ret=filter(f1,[11,22,33,44]) #筛选 等同于 filter(lambda x: x%2==0,[11,22,33,44])
for i in ret:
print(i) #输出 22,44 #map() 按照某种规则映射
ret=map(lambda x: x +100,[1,2,3,4])
for i in ret:
print(i) # 输出 101,102,103,104
# globals() #获取全部的全局变量 locals()获取全部的局部变量
#hash() 哈希值 帮助快速找到对应的值 #zip()
li1=[11,22,33,44]
li2=['a','b','c','d']
li3=['A','B','C','D']
r=zip(li1,li2,li3)
for i in r:
print(i)(11, 'a', 'A')
''' 输出
(22, 'b', 'B')
(33, 'c', 'C')
(44, 'd', 'D')
'''
排序
字符串和数字不能混在一起排序 ,字符串排序时,字符串中的排序顺序为:数字(正常比较),字母(ascii码),中文(转化为16进制)
文件操作
open(文件名,模式,编码)
1
|
文件句柄 = open ( '文件路径' , '模式' ) |
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
- r ,只读模式【默认】
- w,只写模式【不可读;不存在则创建;存在则清空内容;】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【不可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】 :写、追加时指针到最后,f.tell() 获取指针的位置,读,0开始读,写:只要读过(不管都没读完),最后位置追加,如果从特定位置往后写,需要主动seek寻找位置
- w+,写读【可读,可写】 :写之前先清空,再写之后就可以读了,但需要把指针返回到最初位置f.seek(0)
- x+ ,写读【可读,可写】 :如果文件存在会报错,这是和W+的区别
- a+, 写读【可读,可写】 : 打开的同时把指针移到最后,等待追加,f.seek(0)返回到起始位置
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型
truncate() #截取文件内容,依赖于指针的位置 flush # 将内存的数据刷进硬盘中
f1=open('text.txt','r')
for line in f1: # 一行一行读直到读完
print(line)
f1.close # 每次打开都要close一次 with open('text.txt','r') as f: # 自动帮你close()
f.read() #同时打开两个文件,读一行写一行,内存的消耗将会降低
with open('text.txt','r') as f2,open('text1.txt','w') as f3:
for line in f2:
f3.write(line)
冒泡排序
li=[1,123,43,56,78,90,23,34589,234]
inp=1
while(inp<len(li)):
for i in range(len(li)-inp):
if li[i] < li[i+1]:
temp=li[i]
li[i]=li[i+1]
li[i+1]=temp
inp += 1
print(li)
例子:用户登录
def login(username,password):
'''
用于用户名密码的验证
username 用户名
password 用户名密码
返回值:True表示登陆成功
返回值: False 表示登录失败
'''
with open('text.txt','r') as f:
for line in f:
line=line.strip() #默认strip无参数,移除空格、换行符
#有参数,移除两端指定的值
line_list=line.split('$')
if username == line_list[0] and password == line_list[1]:
return True
return False
def register(username,password):
if user_exist(username):
return False
else:
with open('text.txt','a+') as f:
user_list='\n'+username+'$'+password
f.write(user_list)
return True def user_exist(username):
with open('text.txt','r') as f:
for line in f:
line=line.strip()
line_list=line.split('$')
if username == line_list[0]:
return True
return False
def user_modif(username,new_password):
for i in new_password:
if i == '@' or i == '#' or i=='$':
print('你输入得字符不能包含@、#、$')
return False
with open('text.txt','r') as f1:
lines=f1.readlines()
with open('text.txt','w') as f2:
for line in lines:
line_list=line.split('$')
if username == line_list[0]:
new_line=line_list[0]+'$'+new_password+'\n'
f2.write(new_line)
else:
f2.write(line)
return True
def user_del(username):
with open('text.txt','r') as f1:
lines=f1.readlines()
with open('text.txt','w') as f2:
for line in lines:
line_list=line.split('$')
if username == line_list[0]:
continue
else:
f2.write(line)
return True
#print(inp)
while(True):
print('欢迎登陆幸福之门系统\n')
inp=input('1:登陆,2:注册,3:修改密码,4:注销账户,5:退出\n')
if inp == '':
user=input('请输入用户名:')
pwd=input('请输入密码:')
if login(user,pwd):
print('登陆成功!')
else:
print('登录失败!')
elif inp == '':
user=input('请输入用户名:')
pwd=input('请输入密码:')
if register(user,pwd):
print('注册成功!')
else:
print('注册失败!') elif inp == '':
user=input('请输入你想修改密码得用户名:')
password=input('请输入原来账户名得密码')
if login(user,password):
new_password=input('请输入新的密码')
if new_password == password:
print('你输入得密码和原密码相同不用修改!')
else:
if user_modif(user,new_password):
print('修改成功!')
else:
print('修改失败!')
else:
print('输入密码错误无法修改!')
elif inp == '':
user=input('请输入你想注销得用户名:')
password=input('请输入账户名密码')
if login(user,password):
if user_del(user):
print('注销成功!')
else:
print('注销失败!')
else:
print('输入密码错误无法注销!')
elif inp == '':
break
递归
#函数当作参数传递
def f1():
return 'F1' def f2(arg):
print(arg()) # 相当于执行f1(),输出 F1
return 'F2' f2(f1) # f1代指函数,相当于一个变量,是变量就可以当作参数进行传递,f1()执行函数
# 函数名可以当作参数传递 函数名 代指函数内容
装饰器
让函数在执行之前或执行之后做一些操作,只要函数应用上装饰器,那么函数将会被重新定义,重新定义为装饰器的内层函数。
单层装饰器不带参数
# 单层不加参数得装饰器
def outer(func):
def inner():
print('Hello')
print('Hello')
print('Hello')
print('Hello')
r=func() # 原来的f1的函数= func,func()=f1(),r=null(没有返回值)
print('End')
print('End')
print('End')
print('End')
return r
return inner
# 1.执行outer函数,并且将其下面的函数名,当作参数传进去
@outer #2. 将outer的返回值重新赋值给新的f1,新的f1=outer的返回值 ,新的f1=inner
def f1(): # 新的f1()=inner()
print('F1')
@outer
def f2():
print('F2')
@outer
def f3():
print('F3')
f1()
#相当于执行 inner(),原来不加装饰器得f1()调用时只会输出F1,加过装饰器之后得f1()
#输出得结果为
'''
Hello
Hello
Hello
F1
End
End
End
End
'''
#就相当于在不改变原函数得情况下,给原函数附加一些功能
带参数的装饰器(可传任意多的参数,适用多层)
# 带参数的装饰器(可传任意多的参数,适用多层)
def outer(func):
def inner(*args,**kwargs):# 可接受任意多、任意形式的参数
print('Hello')
#print(args)
r=func(*args,**kwargs) # 接收上面inner()中的参数
#print(kwargs)
print('End') #python内部的优化,自动帮你判断f1函数所需要的参数,无需自己提取
return r
return inner
# 1.执行outer函数,并且将其下面的函数名,当作参数传进去
@outer #2. 将outer的返回值重新赋值给新的f1,新的f1=outer的返回值 ,新的f1=inner
def f1(a): # 新的f1()=inner()
print('F1')
print(a) f1(1)
# 同样一个装饰既适用一个参数的,也适用多个参数的
@outer
def f2(a,b,c):
print(a+b+c)
f2(1,2,3)
多层的装饰器
# 多层的装饰器
def outer1(func):
def inner(*args,**kwargs):
print('Hello1')
r=func(*args,**kwargs)
print('End1')
return r
return inner #相当于在第一个装饰上又装饰了一下
def outer2(func):
def inner(*args,**kwargs):
print('Hello2')
r=func(*args,**kwargs)
print('End2')
return r
return inner
@outer1 #(在第一个装饰器外面又装饰了一些东西) # 1.执行outer1函数,并且将其下面的函数名(outer2中的内层函数inner),当作参数传到outer1中
@outer2 #(内部第一个装饰器) #2. 将outer的返回值重新赋值给(outer2中的内层函数inner)
def f1(a,b):
print('F1')
print(a+b) f1(1,1)
#内部装饰器装饰的结果为
'''
Hello2
F1 外面多了一层 Hello2 End2
2
End2
'''
#加上外部装饰器装饰的结果为
'''
Hello1 外面多了一层 Hello1 End1
Hello2
F1
2
End2
End1
'''
python 全栈开发笔记 2的更多相关文章
- python全栈开发笔记---------函数
一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...
- python全栈开发笔记---数据类型--综合练习题
一.有两个列表 l1 = [11,22,33] l2 = [22,33,44] a. 获取内容相同的元素列表 for item in l1: if item in l2: print(it ...
- python全栈开发笔记-----------概要
Python开发 开发: 开发语言: 高级语言:python.Java.php .C# .Go .ruby . C++ .... ===>字节码 低级语言:C.汇编 ...
- python 全栈开发笔记 4
反射 1.通过字符串的形式导入模块 2.通过字符串的形式,去模块中寻找指定函数并执行 ''' def f1(): return 'F1' def f2(): return 'F2' ''' #假设上面 ...
- python 全栈开发笔记 3
正则表达式 正则表达式(RE)是一种小型的,高度专业化的,它镶嵌在python中,并通过re模块实现,正则表达式编译成一系列的字节码,然后由用c编写的匹配引擎执行. #正则表达式 import re ...
- python 全栈开发笔记 1
将自己的姓名用进制表示出来 #自己姓名的进制表示 name=input('请输入你的名字:') for i in name: print(i) # python 3 中是按字符进行循环的 bytes_ ...
- python全栈开发笔记---------字符串格式化
字符串格式化 %s 可以接收任何值, %d只能接收整形 .其他类型报错 msg ='i am %s my body' %'ales' print(msg) #i am ales my body msg ...
- python全栈开发笔记---------数据类型---字典方法
def clear(self) 清空字典里所有元素 # info = { # "k1":18, # "k2":True, # "k3":[ ...
- python全栈开发笔记---------数据类型-----字典dict
字典 #dict #1.基本结构 info= { "k1" : "v1", #键值对 "k2" : "v2" } ### ...
随机推荐
- 清华源和中科大源都停止对Anaconda的支持之后,换腾讯云镜像的方法
直接下载下面的文件解压后放在用户文件夹下即可,windows为"C:\用户\你的用户名\",Linux为"/home/你的用户名/"即用户主目录下. 点我下载 ...
- SP913 QTREE2 - Query on a tree II
思路 第一个可以倍增,第二个讨论在a到lca的路径上还是lca到b的路径上, 倍增即可 代码 #include <cstdio> #include <algorithm> #i ...
- TYVJ P1039 【忠诚2】
题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...
- java知识点集锦--基础知识部分
1.面向对象特征:封装.继承.多态 封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口来访问.面向对象的本质就是将现实世界描绘成一系列完全自治.封闭的对象.我们在类中编写的方法就是 ...
- 微信小程序外包 就找北京动软 专业承接微信小程序定制
很多人问为什么要开发微信小程序,微信小程序的“入口”在哪儿? 1.只有访问过的小程序,才会出现所谓的「入口」. 所有访问过得小程序都可以从微信首屏下面的「发现」点过去.(必须是最新版微信) 这个所谓的 ...
- BaseDao封装
1.lombok 1) 在pom.xml中导入依赖 <!--导入lombok--> <!-- https://mvnrepository.com/artifact/org.proje ...
- Python+turtle交互式绘图:可以用鼠标拖动的小海龟
下面是我画海龟的过程: (1)打开python: 2.调用turtle库,先设置一些基础设置,与一个画龟的函数 from turtle import Screen,Turtle,mainloop cl ...
- volley+okhttp封装,一行代码就可访问网络
volley+okhttp封装,一行代码就可访问网络 前言: 我写这个可能不会完全的教会你去怎么封装一个网络框架,我的目的在于让你不需要你自己封装就可以访问网络,或者说互相学习也可以,我只是想让你大概 ...
- html计时发送验证码功能的实现
function countdown() { var time=60; setTime=setInterval(function(){ if(time<=0){ clearInterval(se ...
- 使用 jquery.wordexport.js导出的Word排版
js导出word文档所需要的两个插件: FileSaver.js jquery.wordexport.js 使用jquery.wordexport.js这个插件导出的word文档的排版方式: 编辑器打 ...