1、定义函数和调用函数

  1. #定义函数def
  2. def greet_user(username):
  3. '''简单的问候语'''
  4. print('Hello,%s!'%username)
  5. greet_user('jack')#调用函数

2、形参和实参,实参的顺序很重要

  1. def describe_flower(flower_type,flower_color='yellow'):
  2. print("My favorite flower is %s."%flower_type)
  3. print("My favorite %s is %s."%(flower_type,flower_color))
  4. describe_flower('rose','red')
  5. describe_flower(flower_type='lily',flower_color='white')
  6. describe_flower(flower_type='babysbreath')#没有提供实参的形参将调用默认值
  7. print('----------')

3、定义一个返回字典的函数

  1. #返回字典
  2. def make_album(singer_name,album_name,num_of_songs=''):
  3. info_of_album={'singer':singer_name,'album':album_name}
  4. if num_of_songs:
  5. info_of_album['number']=num_of_songs
  6. return info_of_album
  7. album1=make_album('周杰伦','十一月的肖邦')
  8. album2=make_album('许嵩','寻雾启事','')
  9. print(album1)
  10. print(album2)

4、在函数中修改列表

  1. def make_great(magicians):
  2. for i in range(len(magicians)):
  3. magicians[i] = 'The great ' + magicians[i]
  4. print(magicians)
  5. def show_magicians(magicians):
  6. for magician in magicians:
  7. print(magician)
  8. mags = ['jack','alex','james']
  9. make_great(mags)
  10. show_magicians(mags)

5、[:]切片法创建列表副本,不改变原列表

  1. def make_great(magicians,new_magicians):
  2. for i in range(len(magicians)):
  3. magicians[i] = 'The great ' + magicians[i]
  4. new_magicians.append(magicians[i])
  5. print(new_magicians)
  6. def show_magicians(magicians):
  7. for magician in magicians:
  8. print(magician)
  9. mags = ['jack','alex','james']
  10. new_mags = []
  11. make_great(mags[:],new_mags)#函数调用列表副本
  12. show_magicians(mags)
  13. show_magicians(new_mags)

6、结合使用位置实参和任意数量实参,Python将先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中;*表示建立一个名为topping的空元组。

  1. #将多余实参全部存放到空元组中
  2. def make_sandwich(size,*toppings):
  3. print('I will make a %s-inch sandwich with the following toppings:'
  4. %str(size))
  5. for topping in toppings:
  6. print('- %s'%topping)
  7. make_sandwich(12,'sausages')
  8. make_sandwich(16,'sausages','mushrooms')

7、使用任意数量的关键字实参;**表示建立一个名为user_info的空字典

  1. #将收到的所有键-值对都封装到这个字典中
  2. def build_profile(first,last,**user_info):
  3. profile = {}
  4. profile['first_name'] = first
  5. profile['last_name'] = last
  6. for key,value in user_info.items():
  7. profile[key] = value
  8. return profile
  9. user_profile = build_profile('james','lebran',
  10. location='shanghai',
  11. hobby='football')
  12. print(user_profile)

8、import 调用模块中函数的几种方法

  1. #导入整个模块,就可以使用模块中所有的函数
  2. import func
  3. func.make_car()
  4. #导入特定的函数
  5. from func import make_car
  6. make_car()
  7. #调用模块中的函数,并指定别名
  8. from func import make_car as mc
  9. car=mc('subaru','outback',color='blue',tow_package=True)
  10. print(car)
  11. #调用模块中所有函数
  12. from func import *
  13. make_sandwich(16,'sausages','mushrooms')

9、%运算符,相除返回余数

  1. #--%--运算符
  2. number = 10
  3. print(number%2)
  4. print(number%3)

10、运算符**表示乘方;2**3表示2的3次方

  1. #for循环求64是2的几次方
  2. a = 64
  3. i = 0
  4. for i in range(100):
  5. a /= 2
  6. i += 1
  7. if a == 1:
  8. print(i)
  9. break
  10. #while循环求64是2的几次方
  11. a = 64
  12. i = 0
  13. while True:
  14. a /= 2
  15. i += 1
  16. if a == 1:
  17. print(i)
  18. break
  19. else:
  20. continue

11、循环语句中的特殊语句

  • continue :跳出本次循环;

  • break:跳出所有循环;

  • 执行return之后,不再执行下面的代码,如果函数中没有return,Python将自动返回一个值None。

12、函数中的默认参数必须放到参数设置的末尾,例如def send(a,b,c="10")

13、元组动态参数*args的两种情况:

  • 第一种:实参不带*将实参放到args这个元组中,传递给函数,无论实参是一个列表还是字符串,都将作为元组的一个元素;

  • 第二种:实参带*,就把实参列表里的每个元素加入到元组中

  1. def send(*args):
  2. print(args,type(args))
  3. a = [11,22,'ddd']
  4. send(a)
  5. send(*a)
  6.  
  7. #([11, 22, 'ddd'],) <class 'tuple'>
  8. #(11, 22, 'ddd') <class 'tuple'>

14、字典动态参数**args:默认将传入的参数,全部放入字典中。实参中必须包含key和value

  1. def send(**args):
  2. print(args,type(args))
  3. send(a=1,b=2)
  4. dic = {'a':1,'b':2}
  5. send(n=dic)
  6. send(**dic)
  7.  
  8. #{'a': 1, 'b': 2} <class 'dict'>
  9. #{'n': {'a': 1, 'b': 2}} <class 'dict'>
  10. #{'a': 1, 'b': 2} <class 'dict'>

15、万能参数:同时使用*args和**kwargs:顺序不能反,一个*必须放在前面

  1. def send(*args,**kwargs):
  2. print(args,type(args))
  3. print(kwargs,type(kwargs))
  4. send(1,2,3,a='',b='')
  5.  
  6. #(1, 2, 3) <class 'tuple'>
  7. #{'a': '1', 'b': '2'} <class 'dict'>

16、全局变量

  • 定义全局变量默认字母全部大写;

  • 如果想在函数中对全局变量重新赋值,需要加入global;

  • 如果全局变量是列表或字典,函数中可以修改全局变量,比如添加删除元素。

  1. #全局变量,任何作用域都可以读取
  2. NAME = 'alex'
  3. def f1():
  4. print(NAME)
  5. def f2():
  6. #修改全局变量
  7. global NAME
  8. NAME = 'alice'
  9. print(NAME)
  10. def f3():
  11. print(NAME)
  12. f1()
  13. f2()
  14. f3()
  15.  
  16. #alex
  17. #alice
  18. #alice

17、两个函数之间加两个空行,函数下面的波浪线就消失了,这样才符合函数的规范操作。

18、练习题:为每个函数添加注释要养成习惯,注释要放在双引号中,单引号会出现波浪线,不规范

  1. def login(username,password):
  2. """
  3. 用于用户登陆
  4. :param username: 用户输入的用户名
  5. :param password:用户输入的密码
  6. :return:True表示登陆成功,False表示登陆失败
  7. """
  8. t = open('text_file\KJ', 'r')
  9. for line in t:
  10. line_list = line.strip().split('|')
  11. if username == line_list[0] and password == line_list[1]:
  12. return True
  13. return False
  14. def register(username,password):
  15. """
  16. 用于用户注册
  17. :param username: 用户输入的用户名
  18. :param password: 用户输入的密码
  19. :return: 默认返回None
  20. """
  21. t = open('text_file\KJ', 'a')
  22. user_info = '\n' + username + '|' + password
  23. t.write(user_info)
  24. t.close()
  25. def main():
  26. """
  27. 让用户选择登陆或注册
  28. """
  29. user_input = input('1:登陆;2:注册:')
  30. if user_input == '':
  31. user = input('请输入账户名:')
  32. pwd = input('请输入密码:')
  33. user_login = login(user,pwd)
  34. if user_login:
  35. print('登陆成功')
  36. else:
  37. print('登陆失败')
  38. elif user_input == '':
  39. user = input('请输入账户名:')
  40. pwd = input('请输入密码:')
  41. register(user, pwd)
  42. main()

19、lambda表达式

  • 就是简单函数的另一种表达方式,只能有一行

  • =前面是函数名,:前面是参数

  1. #def函数
  2. def f1(a):
  3. return a + 100
  4. #lambda表达式
  5. f2 = lambda a,b:a + b + 100
  6. ret1 = f1(10)
  7. print(ret1)
  8. ret2 = f2(10,20)
  9. print(ret2)
  10. #设置默认值
  11. f3 = lambda a,b=10:a + b + 100
  12. ret3 = f3(10)
  13. print(ret3)

20、Python内置函数

  1. #abs( )--取绝对值
  2. a = -1
  3. print(abs(a))
  4. #bool( )--返回布尔值(False:0,None,"",[],(),{})
  5. print(bool(None))
  6. #all( )--括号内接受一个可迭代的数据集,数据集中的每个元素都为真,函数的返回值才为True;
  7. a = all([0,1,2,3])
  8. print(a)
  9. #any( )--括号内也是一个可迭代数据集,任意一个元素为真,就为真;
  10. a = any([0,0,0,3])
  11. print(a)
  12. #ascii( )自动执行类的__repr__
  13. class Name():
  14. def __repr__(self):
  15. return 'abc'
  16. n = ascii(Name())
  17. print(n)
  18. #bin()接受一个十进制,转换成一个二进制
  19. print(bin(8))#结果为0b10000b为二进制标识,8的二进制为1000
  20. #oct()十进制转八进制
  21. print(oct(9))#结果为0o11,0o标识八进制
  22. #hex()十进制转十六进制
  23. print(hex(15))#结果为0xf0x标识十六进制
  24. #UTF-8 一个汉字,三个字节,一个字节8位;
  25. #gbk 一个汉字,两个字节;
  26. #bytes(字符串,encoding=编码类型)把字符串转换为一个字节类型
  27. s = "小明"
  28. print(bytes(s,encoding='utf-8'))#b'\xe5\xb0\x8f\xe6\x98\x8e'
  29. print(bytes(s,encoding='gbk'))#b'\xd0\xa1\xc3\xf7'
  30. #bytearray()将每个字节存储为一个数组的元素
  31. print(bytearray(s,encoding='utf-8'))
  32. #字节类型转字符串,用同样的编码才能往回转换
  33. n = bytes("小芳",encoding='utf-8')#字节类型
  34. print(str(n,encoding='utf-8'))
  35. #文件操作
  36. filename = 'text_file\cats.txt'
  37. with open(filename,'r') as f1:#只读
  38. with open(filename,'w') as f2:#先清空文件,只写
  39. with open(filename,'x') as f3:#文件存在,报错,不存在,创建并只写
  40. with open(filename,'a') as f4:#追加内容
  41. #读取文件时,出现乱码,很可能是编码语言选择错误
  42. with open('text_file\word.txt','r',encoding='gbk') as f5:
  43. contents = f5.read()
  44. print(contents)
  45. #rb,wb,xb,ab,r+b,w+b,x+b,a+b后面带b的,表示直接以字节的方式处理
  46. with open(filename,'rb') as f:
  47. data = f.read()
  48. print(data,type(data))
  49. #b'\xe5\xb0\x8f\xe7\xb1\xb3\r\n' <class 'bytes'>
  50. #把二进制数据添加到文件,需要bytes先转换为字符串
  51. with open(filename,'ab') as f:
  52. data = f.write(bytes('小芳',encoding='utf-8'))
  53. #f.seek(n)指针跳转到n指定的位置(字节)
  54. #f.write()当前指针位置开始向后覆盖,n代表字节的位置
  55. #f.tell()获取文件当前指针的字节位置
  56. #r+,既能读,又能写;如果打开模式无b,read按照字符读取,有b,按字节
  57. #无b,f.read(1)读取第一个字符,有b,读取第一个字节
  58. with open('text_file\cats.txt','r+',encoding='utf-8') as f5:
  59. contents = f5.read(1)
  60. print(contents)#读取第一个字:小
  61. #a+,无论你怎么调整指针位置,写入时都会写在最后
  62. #w+,先清空内容,再写入,才能读取刚才写入的内容
  63. #使用open,close,打开读写文件
  64. f = open(filename,'r')
  65. f.write('')
  66. f.close()
  67. # f.flush()强制刷入硬盘
  68. # f.readable()是否可读
  69. # f.readline()只读取一行
  70. # f.seekable()指针是否可操作
  71. # f.truncate()截断:把指针位置后面的数据都清空
  72. # for line in f: 按行循环文件对象
  73. # 同时打开两个文件,最后同时关闭
  74. # 例如:想把一个文件的内容修改一个人名后写入另一个文件
  75. with open('db1','r') as f1,open('db2','a') as f2:
  76. for line in f1:
  77. new_line = line.replace('alex','alice')
  78. f2.write(new_line)
  1. #将ascii码对照表里十进制转换为字母
  2. r = chr(100)
  3. print(r)#d
  4. #将ascii码对照表里字母转换为十进制
  5. n = ord("d")
  6. print(n)#
  7. #random随机返回一串验证码;ascII码表里65-90为大写字母
  8. import random
  9. li = []
  10. for i in range(4):
  11. r = random.randrange(0,5)
  12. if r == 1 or r == 3:
  13. num1 = random.randrange(0,10)
  14. li.append(str(num1))
  15. else:
  16. num2 = random.randrange(65,91)
  17. li.append(chr(num2))
  18. print(li)
  19. temp = ''.join(li)#join()把列表拼接成字符串
  20. print(temp)
  21. #compile()编译成Python代码
  22. s = "print(123)"
  23. r = compile(s,"<string>","exec")
  24. #exec()执行Python代码;接受代码或者字符串,没有返回值
  25. exec(r)
  26. #eval()将字符串转换成Python代码,并获取结果
  27. #函数只能执行表达式代码
  28. r = "8*8"
  29. ret = eval(r)
  30. print(ret)
  31. #dir()快速查看一个对象提供了哪些功能
  32. print(dir(random))
  33. #help()查看对象提供的详细功能
  34. #divmod()接受两个整数,得到商和余数
  35. #第一种,可以将返回值赋给两个变量
  36. a,b = divmod(97,10)
  37. print(a,b)
  38. #第二种,可以当成一个元组
  39. n = divmod(98,10)
  40. print(n[0])
  41. print(n[1])
  42. #判断对象是否是某个类的实例
  43. r = "abc"
  44. print(isinstance(r,str))#True
  45. '''filter(函数,可迭代的对象),循环第二个参数,
  46. 对参数的每一个元素执行函数,如果函数返回True,
  47. 就把这个元素加入结果,否则就舍弃
  48. '''
  49. def f(a):
  50. if a >2:
  51. return True
  52. li = [1,2,3,4]
  53. ret = filter(f,li)
  54. print(list(ret))#记得要以列表的形式输出
  55. #以lambda表达式实现
  56. ret = filter(lambda a:a>3,li)
  57. print(list(ret))
  58. '''map(函数,可迭代的对象),循环第二个参数,
  59. 对参数的每一个元素执行函数,将函数返回值存放到结果
  60. '''
  61. li = [1,2,3]
  62. ret = map(lambda a:a+100,li)
  63. print(list(ret))#[101, 102, 103]
  64. #globals()返回所有全局变量
  65. #locals()返回所有局部变量
  66. #hash()返回一个对象的hash值,一般用于存储字典的key
  67. #id()查看内存地址
  68. s = "sss"
  69. print(id(s))#
  70. #issubclass()判断一个类是否是另一个类的子类
  71. #Python2中字符长度按字节来算,3中按字符来算
  72. #len('小明')2中返回6,3中返回2
  73. #pow(2,10)求2的10次方
  74. #rount()四舍五入
  75. #slice()切片
  76. #zip()将列表的相同索引的值放到一个元组中
  77. l1 = ['a',1,2]
  78. l2 = ['b',1,2]
  79. l3 = ['c',1,2]
  80. r = zip(l1,l2,l3)
  81. ret = list(r)[0]
  82. print(' '.join(ret))

21、装饰器:@函数名

  • 本质上就是函数,功能是为其他函数添加附加功能,前提是不改变装饰函数的源代码和调用方式;
  • 高阶函数+函数嵌套+闭包
  • 高阶函数:函数的参数或者返回值是一个函数名
  • 函数嵌套:在函数内部定义函数
  • 闭包:在一个作用域里放入定义变量,相当于打了一个包
  • @函数名 是python的一种语法糖
  1. #函数名可以当做参数传递
  2. def f1():
  3. print(123)
  4. def f2(xx):
  5. xx()
  6. f2(f1)#
  7. #装饰器@+函数名,有两个功能:
  8. #1、自动执行outer函数并将其下面的函数名f1当做参数传递
  9. #2、将outer函数的返回值重新赋值给f1=inner
  10. #3、万能参数*args,**kwargs,接受任何数量的参数
  11. def outer(func):
  12. def inner(*args,**kwargs):
  13. print("before")
  14. r = func(*args,**kwargs)
  15. print("after")
  16. return r
  17. return inner
  18. @outer #相当于f1=outer(f1),返回的是inner的内存地址f1=inner,然后f1(args)执行inner(args)函数
  19. def f1(args):
  20. print(args)
  21. return "fff" + args
  22. ret = f1("ddd")#其实是在运行inner函数,最终得到inner函数的返回值
  23. print(ret)

22、生成器,有两种表达方式

  • 生成器表达式:m=(i for i in range(10))    m.__next__()

  • 生成器函数:其实就是由函数改造而来,具有生成能力的函数,标识:函数内部有yield,相当于return,但是可以执行多次

  1. def func():
  2. print(111)
  3. yield 1
  4. print(222)
  5. yield 2
  6. ret = func()#得到一个生成器
  7. print(ret)#<generator object func at 0x00000061358BA138>
  8. #进入函数执行函数,直到遇到yield,获取yield后面的数据,输出
  9. r1 = ret.__next__()
  10. print(r1)#1111
  11. r2 = ret.__next__()
  12. print(r2)#2222
  1. #利用生成器创造一个循环函数
  2. def myrange(arg):
  3. start = 0
  4. while True:
  5. if start > arg:
  6. return
  7. yield start
  8. start += 1
  9. ret = myrange(3)
  10. r = ret.__next__()
  11. print(r)
  12. r = ret.__next__()
  13. print(r)

23、迭代器:就是一个封装了调用函数__next__的循环,让我们不用一步一步调用__next__函数

  • 凡是可作用于for循环的对象都是Iterable类型(可迭代对象);

  • 凡是可作用于next()函数的对象都是Iterator类型(迭代器对象),它们表示一个惰性计算的序列;

  • 生成器都是Iterator对象,生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了
  • 集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

  • Python的for循环本质上就是通过不断调用next()函数实现的;

24、递归:自己调用自己

  1. #递归应用于用户重复登录
  2. def login():
  3. inp = input("输入姓名")
  4. if inp == "admin":
  5. print("success")
  6. else:
  7. return login()
  8. login()
  1. #递归实现从1循环加到7
  2. def add(n):
  3. n += 1
  4. if n <7:
  5. return add(n)
  6. else:
  7. return n
  8. r = add(1)
  9. print(r)#
  10. #递归实现1*2*3*4*5*6*7=5040
  11. def mul(m,n):
  12. n += 1
  13. m *= n
  14. if n < 7:
  15. return mul(m,n)
  16. return m
  17. ret = mul(1,1)
  18. print(ret)#
  19. #另一种方法
  20. def func(num):
  21. if num == 1:
  22. return 1
  23. return num * func(num-1)
  24. ret = func(7)
  25. print(ret)

练习:递归实现斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

  1. def fib(max):
  2. n, a, b = 0, 0, 1
  3. while n < max:
  4. yield b
  5. a, b = b, a + b
  6. n = n + 1
  7. return 'done'

25、反射

  • 利用字符串的形式去对象(模块)中(寻找/检查/删除/设置)成员

  • getattr()寻找、hasattr()检查、delattr()删除、setattr()设置

  • 通过字符串导入模块:

    • obj = __import__("xxx")

    • obj = __import__("file.xxx", fromlist=True)

  1. def func():
  2. inp = input("请输入你要访问的URL(模块名/函数名):")
  3. #hasattr()检查对象中是否包含该成员,是返回True
  4. m, h = inp.split("/")
  5. #__import__通过字符串导入模块,obj.func()调用函数
  6. obj = __import__(m)
  7. #如果模块在文件夹中,后面加个参数fromlist,意思是按前面的指定路径导入
  8. #obj = __import__("lib." + m, fromlist=True)
  9. if hasattr(obj,h):
  10. #getattr()获取对象中的成员
  11. func = getattr(obj,h)
  12. func()
  13. else:
  14. print("")

26、解压序列

  1. a,b,c=(1,2,3)
  2. a=1
  3. b=2
  4. c=3
  5. #取开头和结尾的值
  6. l=[1,2,3,4,5]
  7. a,*_,b=l
  8. a=1
  9. b=5
  10. #*加一个变量,可以是任意字符,表示中间的所有值

27、冒泡算法

需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序

思路:相邻两个值进行比较,将较大的值放在右侧,依次比较!

  1. li = [13, 22, 6, 99, 11]
  2. def func(arg):
  3. for i in range(1,len(arg)):
  4. for m in range(len(li) - i):
  5. if arg[m] > arg[m+1]:
  6. arg[m],arg[m+1] = arg[m+1],arg[m]
  7. print(arg)
  8.  
  9. func(li)

28、列表转字典

  1. status_choice = [(1, '上线'), (2, '下线')]
  2.  
  3. status_list = list(map(lambda x:{'id':x[0],'name':x[1]},Video.status_choice))

Python基础知识:函数的更多相关文章

  1. 1.15 Python基础知识 - 函数

    函数是可重用的程序代码段. 一.函数的声明和调用 声明格式: def 函数名([形参列表]): 函数体 调用格式: 函数名([实参列表]) 函数名:是一种标识符,命名规则为全小写字母,可以使用下划线增 ...

  2. Python基础知识总结笔记(四)函数

    Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...

  3. Python开发【第二篇】:Python基础知识

    Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...

  4. python 基础知识(一)

    python 基础知识(一) 一.python发展介绍 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本 ...

  5. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  6. python 爬虫与数据可视化--python基础知识

    摘要:偶然机会接触到python语音,感觉语法简单.功能强大,刚好朋友分享了一个网课<python 爬虫与数据可视化>,于是在工作与闲暇时间学习起来,并做如下课程笔记整理,整体大概分为4个 ...

  7. python基础知识小结-运维笔记

    接触python已有一段时间了,下面针对python基础知识的使用做一完整梳理:1)避免‘\n’等特殊字符的两种方式: a)利用转义字符‘\’ b)利用原始字符‘r’ print r'c:\now' ...

  8. 八. Python基础(8)--函数

    八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x):     ' ...

  9. python基础知识部分练习大全

    python基础知识部分练习大全   1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py   #必须在首行 ...

  10. 开发技术--浅谈python基础知识

    开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...

随机推荐

  1. Intellij-插件安装-JRebel热部署插件安装

    环境介绍: Win7.JDK1.8.maven+jetty插件.SpringMVC.Intellij IDEA 2018.1.2 安装插件: 在线安装: Settings --> Plugins ...

  2. MongoDB-Oplog详解

    MongoDB Oplog 详解 Oplog 概念 Oplog 是用于存储 MongoDB 数据库所有数据的操作记录的(实际只记录增删改和一些系统命令操作,查是不会记录的),有点类似于 mysql 的 ...

  3. WIN7 环境下搭建 PHP7(64 位)操作步骤

    WIN7 环境下搭建 PHP7(64 位)操作步骤 一.安装与配置 Apache 1.下载 Apache下载地址:https://www.apachelounge.com/download/ 2.安装 ...

  4. 5.数码相框-额外项目电子书总结,并使用svgalib库

    在LCD显示任意编码的文本文件,类似电子书 怎样在LCD上显示文件: 需要哪几个文件? 1.顶部文件 通过main.c分析命令行的操作,然后初始化各个管理文件下的结构体,比如DisplayInit() ...

  5. 【Spring】7、拦截器HandlerInterceptor

    处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   常见 ...

  6. GBK与UTF-8的区别

    GBK的文字编码是双字节来表示的,即不论中.英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1. 至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节) ...

  7. Java集合之LinkedHashMap源码分析

    概述 HashMap是无序的, 即put的顺序与遍历顺序不保证一样. LinkedHashMap是HashMap的一个子类, 它通过重写父类的相关方法, 实现自己的功能. 它保留插入的顺序. 如果需要 ...

  8. LSApplicationQueriesSchemes--关于info.plist 第三方登录 添加URL Schemes白名单

    近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装. 当你的应用在iOS 9 ...

  9. Java 初级软件工程师 认证考试试卷1

    Java 初级软件工程师 认证考试试卷   笔试(A卷)   考试时间150分钟 总分 100分     姓    名_______________________ 身份证号_____________ ...

  10. 原生JS强大DOM选择器querySelector与querySelectorAll

    在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...