函数

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

面向对象:对函数进行分类和封装,让开发“更快更好更强...”

函数式编程最重要的是增强代码的重用性和可读性

  1. def xx():
  2. print('xx') # 定义函数,放入内存当中,并不立即执行
  3.  
  4. #执行函数
  5. xx() #调用函数,这时内存中的函数才开始执行,输出XX

函数的定义主要有如下要点:

  • def:表示函数的关键字
  • 函数名:函数的名称,日后根据函数名调用函数
  • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
  • 参数:为函数体提供数据
  • 返回值:当函数执行完毕后,可以给调用者返回数据。

返回值

函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。

参数

函数的有三中不同的参数:

  • 普通参数
  • 默认参数:有默认参数一定要放在后面
  • 动态参数

形参,实参(默认,按照顺序)

指定形参传入实参,可以不按照顺序

动态参数

  1. #动态参数 一个星号
  2. def f1(*a):
  3. print(a,type(a))
  4. li=[1,2,3,4]
  5. f1(li) # 输出 ([1, 2, 3, 4],) <class 'tuple'> 输出元组会将列表当成一个元素
  6. f1(*li) # 输出 (1, 2, 3, 4) <class 'tuple'> 输出元组会将列表的每一个元素当成元组的每一个元素
  7. f1(123)
  8. f1(123,[4,5,6],{'k1':'43n'},(1,2,3),{1,2,3}) #可传任意多的参数,而且还可以时不同类型的参数
  9. #返回的是元组的类型
  10.  
  11. #动态参数 两个星号
  12. def f2(**a):
  13. print(a,type(a))
  14. f2(k1=123,k2=456)
  15. #输出 {'k1': 123, 'k2': 456} <class 'dict'>
  16. f2(k1=123,k2=456,k3=1212)
  17. #输出 {'k1': 123, 'k2': 456, 'k3': 1212} <class 'dict'>
  18. # 返回的是字典类型,默认输出以键值对的形式
  19. dic={'k1':123} # 也可以将字典直接传进去
  20. f2(**dic) # 但需要再在前面加入两个星号,否则必须要f2(k1=dic) 形式传入
  21. f2(k1=dic)
  22. # 上面的两条调用的输出结果分别为
  23. # {'k1': 123} <class 'dict'> # 这样可以避免引入额外的参数 'k1='
  24. # {'k1': {'k1': 123}} <class 'dict'>
  25.  
  26. #各种参数组合起来
  27. def f3(p,k1=23,*a,**aa):
  28. print(p,type(p))
  29. print(k1,type(k1))
  30. print(a,type(a))
  31. print(aa,type(aa))
  32. f3(11,22,33,44,[00,55,66],k2=456,k3=000)
  33.  
  34. ''' 输出结果为:11 <class 'int'> p接收
  35. 22 <class 'int'> 给k1传了值,所以k1的默认值将会被改变
  36. (33, 44, [0, 55, 66]) <class 'tuple'> *a 接收住
  37. {'k2': 456, 'k3': 0} <class 'dict'> **a接收
  38. '''

局部变量和全局变量

在函数内部 修改和找到全局变量    要用关键字声明 global(变量)   ,全局变量都大写,局部变量都小写

lambda 表达式

f2=lambda : 123  函数的另一种表达方式 ,函数名f2就是个变量

  1. def f3(a1,a2):
  2. return a1+a2
  3.  
  4. f3=lambda a1,a2:a1+a2 # 对于简单的函数,用一个简单的一句话就能表示

python 内置函数

  1. # all() 循环参数,如果每个参数都为真,那么all的返回值为真
  2. print(all([True,False,True])) # 输出False
  3. print(all([True,True,True])) #输出True
  4. # 0,None,空值都为假的,其他都为真的
  5.  
  6. # any() 只要一个为真即为真
  7. print(any([True,False,True])) # 输出True
  8.  
  9. #ascii(对象) 对象的类中找__repr__,获取其返回值
  10.  
  11. # bin()二进制 hex()十六进制 oct()八进制 int ()十进制
  12. print(int('0b11',base=2)) # 二进制转化为十进制
  13. print(int('0o11',base=8)) # 八进制转化为十进制
  14. print(int('0x11',base=16)) # 十六进制转化为十进制
  15.  
  16. #bytes 字节 bytearray (字节列表)
  17. #chr(数字)找到数字对应ascii码 ord(ascii码) 找到ascii码所对应的数字
  18. # 例子 随机验证码
  19. import random
  20. temp=''
  21. for i in range(6):
  22. num1=random.randrange(0,4)
  23. if num1==3 or num1 == 1:
  24. red2=random.randrange(0,10)
  25. temp += str(red2)
  26. else:
  27. red1=random.randrange(65,91)
  28. c=chr(red1)
  29. temp += c
  30. print('验证码:',temp)
  31.  
  32. # callable(f1) 判断f1()是不是可执行的 ,是返回True
  33. #compile() 编译 complex() 复数 dir() 查看对象的方法
  34. # divmod()
  35. print(divmod(10,3)) # 输出(3,1) 商和余数
  36. # eval() exec()
  37. print(eval('1+3')) #输出4
  38. exec('for i in range(10):print(i)') #将字符串当成python代码执行,没有返回值
  39.  
  40. # filter(函数,可迭代的对象) 筛选元素
  41. def f1(x): #筛选偶数
  42. if x%2 == 0:
  43. return True
  44. ret=filter(f1,[11,22,33,44]) #筛选 等同于 filter(lambda x: x%2==0,[11,22,33,44])
  45. for i in ret:
  46. print(i) #输出 22,44
  47.  
  48. #map() 按照某种规则映射
  49. ret=map(lambda x: x +100,[1,2,3,4])
  50. for i in ret:
  51. print(i) # 输出 101,102,103,104
  52. # globals() #获取全部的全局变量 locals()获取全部的局部变量
  53. #hash() 哈希值 帮助快速找到对应的值
  54.  
  55. #zip()
  56. li1=[11,22,33,44]
  57. li2=['a','b','c','d']
  58. li3=['A','B','C','D']
  59. r=zip(li1,li2,li3)
  60. for i in r:
  61. print(i)(11, 'a', 'A')
  62. ''' 输出
  63. (22, 'b', 'B')
  64. (33, 'c', 'C')
  65. (44, 'd', 'D')
  66. '''

排序

字符串和数字不能混在一起排序 ,字符串排序时,字符串中的排序顺序为:数字(正常比较),字母(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 # 将内存的数据刷进硬盘中

  1. f1=open('text.txt','r')
  2. for line in f1: # 一行一行读直到读完
  3. print(line)
  4. f1.close # 每次打开都要close一次
  5.  
  6. with open('text.txt','r') as f: # 自动帮你close()
  7. f.read()
  8.  
  9. #同时打开两个文件,读一行写一行,内存的消耗将会降低
  10. with open('text.txt','r') as f2,open('text1.txt','w') as f3:
  11. for line in f2:
  12. f3.write(line)

冒泡排序

  1. li=[1,123,43,56,78,90,23,34589,234]
  2. inp=1
  3. while(inp<len(li)):
  4. for i in range(len(li)-inp):
  5. if li[i] < li[i+1]:
  6. temp=li[i]
  7. li[i]=li[i+1]
  8. li[i+1]=temp
  9. inp += 1
  10. print(li)

例子:用户登录

  1. def login(username,password):
  2. '''
  3. 用于用户名密码的验证
  4. username 用户名
  5. password 用户名密码
  6. 返回值:True表示登陆成功
  7. 返回值: False 表示登录失败
  8. '''
  9. with open('text.txt','r') as f:
  10. for line in f:
  11. line=line.strip() #默认strip无参数,移除空格、换行符
  12. #有参数,移除两端指定的值
  13. line_list=line.split('$')
  14. if username == line_list[0] and password == line_list[1]:
  15. return True
  16. return False
  17. def register(username,password):
  18. if user_exist(username):
  19. return False
  20. else:
  21. with open('text.txt','a+') as f:
  22. user_list='\n'+username+'$'+password
  23. f.write(user_list)
  24. return True
  25.  
  26. def user_exist(username):
  27. with open('text.txt','r') as f:
  28. for line in f:
  29. line=line.strip()
  30. line_list=line.split('$')
  31. if username == line_list[0]:
  32. return True
  33. return False
  34. def user_modif(username,new_password):
  35. for i in new_password:
  36. if i == '@' or i == '#' or i=='$':
  37. print('你输入得字符不能包含@、#、$')
  38. return False
  39. with open('text.txt','r') as f1:
  40. lines=f1.readlines()
  41. with open('text.txt','w') as f2:
  42. for line in lines:
  43. line_list=line.split('$')
  44. if username == line_list[0]:
  45. new_line=line_list[0]+'$'+new_password+'\n'
  46. f2.write(new_line)
  47. else:
  48. f2.write(line)
  49. return True
  50. def user_del(username):
  51. with open('text.txt','r') as f1:
  52. lines=f1.readlines()
  53. with open('text.txt','w') as f2:
  54. for line in lines:
  55. line_list=line.split('$')
  56. if username == line_list[0]:
  57. continue
  58. else:
  59. f2.write(line)
  60. return True
  61. #print(inp)
  62. while(True):
  63. print('欢迎登陆幸福之门系统\n')
  64. inp=input('1:登陆,2:注册,3:修改密码,4:注销账户,5:退出\n')
  65. if inp == '':
  66. user=input('请输入用户名:')
  67. pwd=input('请输入密码:')
  68. if login(user,pwd):
  69. print('登陆成功!')
  70. else:
  71. print('登录失败!')
  72. elif inp == '':
  73. user=input('请输入用户名:')
  74. pwd=input('请输入密码:')
  75. if register(user,pwd):
  76. print('注册成功!')
  77. else:
  78. print('注册失败!')
  79.  
  80. elif inp == '':
  81. user=input('请输入你想修改密码得用户名:')
  82. password=input('请输入原来账户名得密码')
  83. if login(user,password):
  84. new_password=input('请输入新的密码')
  85. if new_password == password:
  86. print('你输入得密码和原密码相同不用修改!')
  87. else:
  88. if user_modif(user,new_password):
  89. print('修改成功!')
  90. else:
  91. print('修改失败!')
  92. else:
  93. print('输入密码错误无法修改!')
  94. elif inp == '':
  95. user=input('请输入你想注销得用户名:')
  96. password=input('请输入账户名密码')
  97. if login(user,password):
  98. if user_del(user):
  99. print('注销成功!')
  100. else:
  101. print('注销失败!')
  102. else:
  103. print('输入密码错误无法注销!')
  104. elif inp == '':
  105. break

递归

  1. #函数当作参数传递
  2. def f1():
  3. return 'F1'
  4.  
  5. def f2(arg):
  6. print(arg()) # 相当于执行f1(),输出 F1
  7. return 'F2'
  8.  
  9. f2(f1) # f1代指函数,相当于一个变量,是变量就可以当作参数进行传递,f1()执行函数
  10. # 函数名可以当作参数传递 函数名 代指函数内容

装饰器

让函数在执行之前或执行之后做一些操作,只要函数应用上装饰器,那么函数将会被重新定义,重新定义为装饰器的内层函数。

单层装饰器不带参数

  1. # 单层不加参数得装饰器
  2. def outer(func):
  3. def inner():
  4. print('Hello')
  5. print('Hello')
  6. print('Hello')
  7. print('Hello')
  8. r=func() # 原来的f1的函数= func,func()=f1(),r=null(没有返回值)
  9. print('End')
  10. print('End')
  11. print('End')
  12. print('End')
  13. return r
  14. return inner
  15. # 1.执行outer函数,并且将其下面的函数名,当作参数传进去
  16. @outer #2. 将outer的返回值重新赋值给新的f1,新的f1=outer的返回值 ,新的f1=inner
  17. def f1(): # 新的f1()=inner()
  18. print('F1')
  19. @outer
  20. def f2():
  21. print('F2')
  22. @outer
  23. def f3():
  24. print('F3')
  25. f1()
  26. #相当于执行 inner(),原来不加装饰器得f1()调用时只会输出F1,加过装饰器之后得f1()
  27. #输出得结果为
  28. '''
  29. Hello
  30. Hello
  31. Hello
  32. F1
  33. End
  34. End
  35. End
  36. End
  37. '''
  38. #就相当于在不改变原函数得情况下,给原函数附加一些功能

带参数的装饰器(可传任意多的参数,适用多层)

  1. # 带参数的装饰器(可传任意多的参数,适用多层)
  2. def outer(func):
  3. def inner(*args,**kwargs):# 可接受任意多、任意形式的参数
  4. print('Hello')
  5. #print(args)
  6. r=func(*args,**kwargs) # 接收上面inner()中的参数
  7. #print(kwargs)
  8. print('End') #python内部的优化,自动帮你判断f1函数所需要的参数,无需自己提取
  9. return r
  10. return inner
  11. # 1.执行outer函数,并且将其下面的函数名,当作参数传进去
  12. @outer #2. 将outer的返回值重新赋值给新的f1,新的f1=outer的返回值 ,新的f1=inner
  13. def f1(a): # 新的f1()=inner()
  14. print('F1')
  15. print(a)
  16.  
  17. f1(1)
  18. # 同样一个装饰既适用一个参数的,也适用多个参数的
  19. @outer
  20. def f2(a,b,c):
  21. print(a+b+c)
  22. f2(1,2,3)

多层的装饰器

  1. # 多层的装饰器
  2. def outer1(func):
  3. def inner(*args,**kwargs):
  4. print('Hello1')
  5. r=func(*args,**kwargs)
  6. print('End1')
  7. return r
  8. return inner #相当于在第一个装饰上又装饰了一下
  9. def outer2(func):
  10. def inner(*args,**kwargs):
  11. print('Hello2')
  12. r=func(*args,**kwargs)
  13. print('End2')
  14. return r
  15. return inner
  16. @outer1 #(在第一个装饰器外面又装饰了一些东西) # 1.执行outer1函数,并且将其下面的函数名(outer2中的内层函数inner),当作参数传到outer1中
  17. @outer2 #(内部第一个装饰器) #2. 将outer的返回值重新赋值给(outer2中的内层函数inner)
  18. def f1(a,b):
  19. print('F1')
  20. print(a+b)
  21.  
  22. f1(1,1)
  23. #内部装饰器装饰的结果为
  24. '''
  25. Hello2
  26. F1 外面多了一层 Hello2 End2
  27. 2
  28. End2
  29. '''
  30. #加上外部装饰器装饰的结果为
  31. '''
  32. Hello1 外面多了一层 Hello1 End1
  33. Hello2
  34. F1
  35. 2
  36. End2
  37. End1
  38. '''

python 全栈开发笔记 2的更多相关文章

  1. python全栈开发笔记---------函数

    一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...

  2. python全栈开发笔记---数据类型--综合练习题

    一.有两个列表 l1 = [11,22,33]       l2 = [22,33,44] a. 获取内容相同的元素列表 for item in l1: if item in l2: print(it ...

  3. python全栈开发笔记-----------概要

    Python开发 开发: 开发语言: 高级语言:python.Java.php  .C#   .Go .ruby . C++ .... ===>字节码 低级语言:C.汇编            ...

  4. python 全栈开发笔记 4

    反射 1.通过字符串的形式导入模块 2.通过字符串的形式,去模块中寻找指定函数并执行 ''' def f1(): return 'F1' def f2(): return 'F2' ''' #假设上面 ...

  5. python 全栈开发笔记 3

    正则表达式 正则表达式(RE)是一种小型的,高度专业化的,它镶嵌在python中,并通过re模块实现,正则表达式编译成一系列的字节码,然后由用c编写的匹配引擎执行. #正则表达式 import re ...

  6. python 全栈开发笔记 1

    将自己的姓名用进制表示出来 #自己姓名的进制表示 name=input('请输入你的名字:') for i in name: print(i) # python 3 中是按字符进行循环的 bytes_ ...

  7. python全栈开发笔记---------字符串格式化

    字符串格式化 %s 可以接收任何值, %d只能接收整形 .其他类型报错 msg ='i am %s my body' %'ales' print(msg) #i am ales my body msg ...

  8. python全栈开发笔记---------数据类型---字典方法

    def clear(self) 清空字典里所有元素 # info = { # "k1":18, # "k2":True, # "k3":[ ...

  9. python全栈开发笔记---------数据类型-----字典dict

    字典 #dict #1.基本结构 info= { "k1" : "v1", #键值对 "k2" : "v2" } ### ...

随机推荐

  1. sed命令替换文件的内容【学习笔记】

    sed -i "s/line/Line/g" `grep "line" -rl /home//zhuangzebin/`

  2. windows下安装git和vundle

    git在windows下的版本是: git-for-windows, 或者说是: msysgit: ms-sys-git 直接在 https://gitforwindows.org/上下载 git对w ...

  3. 【新特性】JDK1.9

    一.目录结构 JDK9具体目录结构如下所示: bin: 该目录包含所有的命令. conf: 包含用户可以编辑的配置文件,例如以前位于jre\lib 目录中的.properties 和 .policy ...

  4. Deep Learning--week1~week3

    week1 一张图片,设像素为64*64, 颜色通道为红蓝绿三通道,则对应3个64*64实数矩阵 为了用向量表示这些矩阵,将这些矩阵的像素值展开为一个向量x作为算法的输入 从红色到绿色再到蓝色,依次按 ...

  5. 如何在Windows上的Jupyter Notebook中安装和运行PySpark

    When I write PySpark code, I use Jupyter notebook to test my code before submitting a job on the clu ...

  6. 「面向打野编程」iOS多线程:CGD

    「面向打野编程」iOS多线程:CGD 前言 参考网络其他文章而写,渣水平,抛砖引玉. 虽然Concurrent意思为并发,但由于队列的实际效果,以下称为并行队列. 当前iPhone的CPU核心数远小于 ...

  7. SpringMVC成员变量并发状态下使用测试

    1.SpringMVC默认是单例的,使用成员变量在并发状态下该成员变量的值是被共享的 测试平台 我们目前正在开发的电商项目  (架构组成SpringCloud + SpringBoot + Sprin ...

  8. selenium修改cookie

    WebDriver操作cookie的方法:cookie以字典形式保存 get_cookies()     获取所有的cookie get_cookie(name)   返回字典的key为"n ...

  9. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

  10. AT2412 最大の和

    传送门 思路: 线段树暴力枚举区间,查询最大区间和. Code: #include<iostream> #include<cstdio> #include<algorit ...