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" } ### ...
随机推荐
- sed命令替换文件的内容【学习笔记】
sed -i "s/line/Line/g" `grep "line" -rl /home//zhuangzebin/`
- windows下安装git和vundle
git在windows下的版本是: git-for-windows, 或者说是: msysgit: ms-sys-git 直接在 https://gitforwindows.org/上下载 git对w ...
- 【新特性】JDK1.9
一.目录结构 JDK9具体目录结构如下所示: bin: 该目录包含所有的命令. conf: 包含用户可以编辑的配置文件,例如以前位于jre\lib 目录中的.properties 和 .policy ...
- Deep Learning--week1~week3
week1 一张图片,设像素为64*64, 颜色通道为红蓝绿三通道,则对应3个64*64实数矩阵 为了用向量表示这些矩阵,将这些矩阵的像素值展开为一个向量x作为算法的输入 从红色到绿色再到蓝色,依次按 ...
- 如何在Windows上的Jupyter Notebook中安装和运行PySpark
When I write PySpark code, I use Jupyter notebook to test my code before submitting a job on the clu ...
- 「面向打野编程」iOS多线程:CGD
「面向打野编程」iOS多线程:CGD 前言 参考网络其他文章而写,渣水平,抛砖引玉. 虽然Concurrent意思为并发,但由于队列的实际效果,以下称为并行队列. 当前iPhone的CPU核心数远小于 ...
- SpringMVC成员变量并发状态下使用测试
1.SpringMVC默认是单例的,使用成员变量在并发状态下该成员变量的值是被共享的 测试平台 我们目前正在开发的电商项目 (架构组成SpringCloud + SpringBoot + Sprin ...
- selenium修改cookie
WebDriver操作cookie的方法:cookie以字典形式保存 get_cookies() 获取所有的cookie get_cookie(name) 返回字典的key为"n ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
- AT2412 最大の和
传送门 思路: 线段树暴力枚举区间,查询最大区间和. Code: #include<iostream> #include<cstdio> #include<algorit ...