python学习笔记一基础和函数
1.python中不存在null,true,false
在字典中要做替换成None,True,False
2.取字典数据时,使用网站https://www.bejson.com/jsonviewernew/,可以更清晰的看json/字典结构
3.函数的形参、实参、位置参数
def add(a,b): #形参,形式参数 print(a+b) add(2,3) #实参,实际参数,a指向2,b指向3
add(a=3,b=2) #明确位置指向的实际参数
4.打开文件的函数open(),查看函数默认参数的方法:鼠标移到函数上,ctrl+鼠标左键
5.默认参数:函数有默认参数。要把无默认参数的放前面,有默认参数的放后面,比如:add(a,b=2),不然会报错
def add(a=2,b=3): #给默认参数 print(a+b) add() #调用时,不需要传参,也可得到结果 5 add(a=4,b=5) #更新赋值
举例:调用目录下的文件
def data_dir(filePath='d:/data',fileName=None): print(filePath) print(fileName) data_dir(fileName='test.txt') #因为函数有默认参数,所以需写清文件名的指定参数名,不然会默认把test.txt赋给filePath
6.函数的动态参数
用到动态参数的场景:请求参数个数不确定;请求参数的数据类型不确定(可能是元组、字典、字符串)
#动态参数 def f1(*args,**kwargs): pass #一个*代表的数据类型是元组,两个*代表的数据类型是字典。当赋值的实参不是字典,都会放到元组当中
举例:
def f1(*args,**kwargs): print(args,kwargs)
f1([1,2,3])
f1('a')
f1({nam='wuya'})
f1({dict1={'name':'wuya'})
输出结果:
([1,2,3],){}
(‘a’,){}
(){'name':'wuya'}
(){'dict1':{'name':'wuya'}}
举例:需求:
1.对请求参数进行ascill排序(sorted函数)
2.排序后,对请求参数进行md5加密
实现:1.排序
def data(**kwargs): return dict(sorted(kwargs.items(),key=lambda item:item[0])) dict1={'name':'wuya','age':18,'address':'xian','work':'tester'} print(data(**dict1))
2.加密
思路:写一个函数,获取请求参数,对请求参数进行加密。
对密码进行加密登录:
import requests import hashlib def MD5_login(str): zt_pwd = hashlib.md5() zt_pwd.update(str.encode(encoding='utf-8')) return zt_pwd.hexdigest() password = '123456' #登陆的用户密码=='123456' url = 'http://192.168.1.105:81/zentao/user-login-L3plbnRhby8=.html' data = {'account':'admin','password':MD5_login(password),'referer':'/zentao/'} response = requests.post(url,data=data) # 发送post请求 print(response.content.decode('utf-8'))
7.函数返回值
- 每一个函数都有返回值(针对使用print()的函数,返回值就是None)
- return后面的内容就是函数的返回值
什么样的情况下使用函数返回值:获取token、session、cookie;查看提交的订单编号等情况
获取token的思路:发送登录请求,拿到返回结果,取到token值;下次访问其他界面时把token带进去
1 def login(): 2 username=input('请输入登录账号:\n') 3 password=input('请输入登录密码:\n') 4 if username=='wuya' and password=='123456' 5 return 'hdklfhkdfu4343' 6 7 def profile(token): 8 if token==login(): 9 print('欢迎访问无涯的首页') 10 else: 11 print('未登录,跳转到登录的页面,302') 12 13 profile('hdklfhkdfu4343')
8.函数作用域
- 全局作用域:针对全局变量
- 局部作用域:针对局部变量
1 #代码执行顺序是从上往下的,当函数名相同时,调用距离最近的函数 2 name='无涯' #全局变量 3 def f(): 4 name='无涯课堂' #局部变量 5 print(name) 6 f()
#输出结果:
无涯课堂
name='无涯' def f(): print(name) f() #输出结果: 无涯
引进全局变量,并更新:
name='无涯' def f(): global name name='无涯课堂' print(name) f()
#输出结果:
无涯课堂
函数执行顺序:
def f(): name='我是父函数的值' def f1(): name='我是子函数的值' print(name) return f1() f() #函数执行顺序 1.执行def f(),找到name=父函数的值 2.执行 return f1() 3.找到f1函数里面的name变量,输出了name是值 4.输出:我是子函数的值
9.内部函数:(比如max()、min()、type()等)
- 不修改全局变量可以访问全局变量
- 修改同名全局变量,则python会认为它是一个局部变量
- 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError
10.三目运算:
1.一是通过if语句实现的,语法如下:
<true statement> if <condition expression> else <false statement>
首先对条件表达式<condition expression>求值,如果值为True,则执行<true statement>,否则执行<false statement>
x=1 y=3 z= x-y if x>y else x+y print(z)
2.是通过and、or来实现,此方式利用的是逻辑运算符的短路原则来实现的。语法如下:
<condition expression> and <true statement> or <false statement>
x=1 y=3 z= x>y and x-y or x+y print(z)
11.lambda匿名函数语法:(冒号前是参数,冒号后是判断及表达式)
lambda parameters:express
parameters:可选,如果提供,通常是逗号分隔的变量表达式形式,即位置参数。
expression:不能包含分支或循环(但允许条件表达式),也不能包含return(或yield)函数。如果为元组,则应用圆括号将其包含起来。
调用lambda函数,返回的结果是对表达式计算产生的结果。
根据参数是否为1 决定s为yes还是no
>>> s = lambda x:"yes" if x==1 else "no"
>>> s(0)
'no'
>>> s(1)
'yes'
上面例子中,将if...else语句缩减为单一的条件表达式,语法为:
expression1 if A else expression2
如果A为True,条件表达式的结果为expression1,否则为expression2
login=lambda username,password:print('登录成功')if username=='wuya' and password=='123456' else print('登录失败')
print(login('wuya','123456'))
#输出:
登录成功
data=lambda **kwargs:dict(sorted(kwargs.items(),key=lambda item:item[0])) print(data('name':'wuya','age':18,'address':'xian','work':'tester'))
sorted(d.items(), key=lambda x: x[1]) 中 d.items() 为待排序的对象(即kwargs);key=lambda x: x[1] 为对前面的对象中的第二维数据(即value)的值进行排序(即对第一个item进行排序)。
key=lambda 变量:变量[维数] 。维数可以按照自己的需要进行设置。
12.map函数
功能:遍历序列,对序列中每个元素进行操作,最终获取新的序列。
map(function, iterable, ...)
- function -- 函数
- iterable -- 一个或多个序列,可迭代的,
可以
for
循环的
- 将函数返回值添加到结果中
i = [11, 22, 33, 44, 55]
def f2(a): return a + 100 result = map(f2, li) #输出[111,122,133,144,155] result = map(lambda a: a + 200, li) #输出[211,222,233,244,255]
print(list(result))
应用场景:
1、每个元素增加100
2、两个列表对应元素相加
注意:
map
()函数不改变原有的
list
,而是返回一个新的
list
。
利用
map
()函数,可以把一个
list
转换为另一个
list
,只需要传入转换函数。
由于
list
包含的元素可以是任何类型,因此,
map
() 不仅仅可以处理只包含数值的
list
,事实上它可以处理包含任意类型的
list
,只要传入的函数f可以处理这种数据类型。
list1= [11, 22, 33, 44, 55] print(list(map(lambda a:a+100,list1)))
13.filter函数
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
语法:
filter(function, iterable)
list1=[-1,1,2,3,4,5] def f(): list2=[] for i in list1: if i>1: #过滤掉小于1的数 list2.append(i) #把大于1的数追加到list2里面 print(list2)
list1=[-1,1,2,3,4,5] print(list(filter(lambda a:a>1,list1)))