浅调

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 == '1':
        user=input('请输入用户名:')
        pwd=input('请输入密码:')
        if login(user,pwd):
            print('登陆成功!')
        else:
            print('登录失败!')
    elif inp == '2':
        user=input('请输入用户名:')
        pwd=input('请输入密码:')
        if register(user,pwd):
            print('注册成功!')
        else:
            print('注册失败!')

    elif inp == '3':
        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 == '4':
        user=input('请输入你想注销得用户名:')
        password=input('请输入账户名密码')
        if login(user,password):
            if user_del(user):
                print('注销成功!')
            else:
                print('注销失败!')
        else:
            print('输入密码错误无法注销!')
    elif inp == '5':
        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
'''

 

posted on 2017-07-22 09:38  浅调  阅读(173)  评论(0编辑  收藏  举报

导航