函数参数

函数参数包括位置参数,关键字参数,动态参数(*args, **args)三种。

传参的过程是形式参数的赋值。

*args传入的参数是元组形式,**args传入的参数是字典形式。

示例代码如下:(这部分直接看代码实例会更清楚静态参数与动态参数如何混用)

  1. 1 #!/usr/bin/env python
  2. 2 # -*- coding:utf-8 -*-
  3. 3 # def story(**kwargs):
  4. 4 # return 'Once upon a time,there was a '\
  5. 5 # '%(job)s called %(name)s.' % kwargs
  6. 6 # print(story(job = 'king',name = 'bolen'))
  7. 7 #
  8. 8 # def power(x,y,*others):
  9. 9 # if others:
  10. 10 # print('received redundant parameters:',others)
  11. 11 # return pow(x,y)
  12. 12 # power(2,3,)
  13. 13
  14. 14 def interval(start,stop = None,step = 1):
  15. 15 if stop is None:
  16. 16 start,stop=0,start
  17. 17 result = []
  18. 18 i = start
  19. 19 while i < stop:
  20. 20 result.append(i)
  21. 21 i+=step
  22. 22 return result
  23. 23
  24. 24 -----------------------shell excute-------------------------------
  25. 25 >>> story(job = 'king',name = 'bolen')
  26. 26 'Once upon a time,there was a king called bolen.'
  27. 27 >>> parms = {'job':'engineer','name':'jack'}
  28. 28 >>> story(**parms)
  29. 29 'Once upon a time,there was a engineer called jack.'
  30. 30 >>> del parms['job']
  31. 31 >>> parms
  32. 32 {'name': 'jack'}
  33. 33 >>> story(job = '小王子',**parms)
  34. 34 'Once upon a time,there was a 小王子 called jack.'
  35. 35
  36. 36 >>> power(2,3)
  37. 37 8
  38. 38 >>> power(y=3,x=2)
  39. 39 8
  40. 40 >>> parms = (5,)*2
  41. 41 >>> type(parms)
  42. 42 <class 'tuple'>
  43. 43 >>> power(*parms)
  44. 44 3125
  45. 45 >>> parms
  46. 46 (5, 5)
  47. 47
  48. 48
  49. 49 >>> interval(10)
  50. 50 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  51. 51 >>> interval(1,6)
  52. 52 [1, 2, 3, 4, 5]
  53. 53 >>> interval(2,12,3)
  54. 54 [2, 5, 8, 11]
  55. 55 >>> power(*interval(3,7))
  56. 56 received redundant parameters: (5, 6)
  57. 57 81
  58. 58

函数参数示例

变量作用域

函数内部的变量称为局部变量,全局无法访问局部变量,函数内部正常也无法访问全局变量,除非以如下方式:

函数内读取全局变量:(慎重引用全局变量,容易出错)

  1. 1 >>> def com(para):
  2. 2 print(para+globals()['para'])
  3. 3 >>> com('yingying')
  4. 4 yingyingbolen

函数内声明全局变量:

  1. 1 >>> def ch_global():
  2. 2 global x
  3. 3 x +=1
  4. 4 >>> x = 1
  5. 5 >>> ch_global()
  6. 6 >>> x
  7. 7 2

Python内置函数

详细介绍请点击:官网内置函数详解

Python文件操作:open函数和with open(管理上下文)

open函数用于文件处理。一般步骤是打开文件,然后操作文件。

  1. 1 文件句柄 = open('文件路径','模式')
  1. 句柄WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。
  1. 句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。

  1. 文件句柄在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,再通过调用系统函数来关闭该文件。

打开后获得该文件句柄,后面通过此文件句柄对文件操作。

一、打开文件

打开文件的模式有:

  • r ,只读模式【默认】
  • w,只写模式【不可读;不存在则创建;存在则清空内容;】
  • x, 只写模式【不可读;不存在则创建,存在则报错】
  • a, 追加模式【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】

"b"表示以字节的方式操作

  • rb  或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b

注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型。

二、文件操作

  1. 1 class TextIOWrapper(_TextIOBase):
  2. 2 """
  3. 3 Character and line based layer over a BufferedIOBase object, buffer.
  4. 4
  5. 5 encoding gives the name of the encoding that the stream will be
  6. 6 decoded or encoded with. It defaults to locale.getpreferredencoding(False).
  7. 7
  8. 8 errors determines the strictness of encoding and decoding (see
  9. 9 help(codecs.Codec) or the documentation for codecs.register) and
  10. 10 defaults to "strict".
  11. 11
  12. 12 newline controls how line endings are handled. It can be None, '',
  13. 13 '\n', '\r', and '\r\n'. It works as follows:
  14. 14
  15. 15 * On input, if newline is None, universal newlines mode is
  16. 16 enabled. Lines in the input can end in '\n', '\r', or '\r\n', and
  17. 17 these are translated into '\n' before being returned to the
  18. 18 caller. If it is '', universal newline mode is enabled, but line
  19. 19 endings are returned to the caller untranslated. If it has any of
  20. 20 the other legal values, input lines are only terminated by the given
  21. 21 string, and the line ending is returned to the caller untranslated.
  22. 22
  23. 23 * On output, if newline is None, any '\n' characters written are
  24. 24 translated to the system default line separator, os.linesep. If
  25. 25 newline is '' or '\n', no translation takes place. If newline is any
  26. 26 of the other legal values, any '\n' characters written are translated
  27. 27 to the given string.
  28. 28
  29. 29 If line_buffering is True, a call to flush is implied when a call to
  30. 30 write contains a newline character.
  31. 31 """
  32. 32 def close(self, *args, **kwargs): # real signature unknown
  33. 33 关闭文件
  34. 34 pass
  35. 35
  36. 36 def fileno(self, *args, **kwargs): # real signature unknown
  37. 37 文件描述符
  38. 38 pass
  39. 39
  40. 40 def flush(self, *args, **kwargs): # real signature unknown
  41. 41 刷新文件内部缓冲区
  42. 42 pass
  43. 43
  44. 44 def isatty(self, *args, **kwargs): # real signature unknown
  45. 45 判断文件是否是同意tty设备
  46. 46 pass
  47. 47
  48. 48 def read(self, *args, **kwargs): # real signature unknown
  49. 49 读取指定字节数据
  50. 50 pass
  51. 51
  52. 52 def readable(self, *args, **kwargs): # real signature unknown
  53. 53 是否可读
  54. 54 pass
  55. 55
  56. 56 def readline(self, *args, **kwargs): # real signature unknown
  57. 57 仅读取一行数据
  58. 58 pass
  59. 59
  60. 60 def seek(self, *args, **kwargs): # real signature unknown
  61. 61 指定文件中指针位置
  62. 62 pass
  63. 63
  64. 64 def seekable(self, *args, **kwargs): # real signature unknown
  65. 65 指针是否可操作
  66. 66 pass
  67. 67
  68. 68 def tell(self, *args, **kwargs): # real signature unknown
  69. 69 获取指针位置
  70. 70 pass
  71. 71
  72. 72 def truncate(self, *args, **kwargs): # real signature unknown
  73. 73 截断数据,仅保留指定之前数据
  74. 74 pass
  75. 75
  76. 76 def writable(self, *args, **kwargs): # real signature unknown
  77. 77 是否可写
  78. 78 pass
  79. 79
  80. 80 def write(self, *args, **kwargs): # real signature unknown
  81. 81 写内容
  82. 82 pass
  83. 83
  84. 84 def __getstate__(self, *args, **kwargs): # real signature unknown
  85. 85 pass
  86. 86
  87. 87 def __init__(self, *args, **kwargs): # real signature unknown
  88. 88 pass
  89. 89
  90. 90 @staticmethod # known case of __new__
  91. 91 def __new__(*args, **kwargs): # real signature unknown
  92. 92 """ Create and return a new object. See help(type) for accurate signature. """
  93. 93 pass
  94. 94
  95. 95 def __next__(self, *args, **kwargs): # real signature unknown
  96. 96 """ Implement next(self). """
  97. 97 pass
  98. 98
  99. 99 def __repr__(self, *args, **kwargs): # real signature unknown
  100. 100 """ Return repr(self). """
  101. 101 pass
  102. 102
  103. 103 buffer = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  104. 104
  105. 105 closed = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  106. 106
  107. 107 encoding = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  108. 108
  109. 109 errors = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  110. 110
  111. 111 line_buffering = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  112. 112
  113. 113 name = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  114. 114
  115. 115 newlines = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  116. 116
  117. 117 _CHUNK_SIZE = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  118. 118
  119. 119 _finalizing = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
  120. 120
  121. 121 3.x

Python3中的文件操作

三、管理上下文

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

  1. 1 try:
  2. 2 f = open('/path/to/file', 'r')
  3. 3 print(f.read())
  4. 4 finally:
  5. 5 if f:
  6. 6 f.close()
  7. 7

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

  1. 1 with open('/path/to/file', 'r') as f:
  2. 2 print(f.read())
  3. 3

这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,即:

  1. 1 with open('log1') as obj1, open('log2') as obj2:
  2. 2 pass
  3. 3
  1. 1 import sys
  2. 2 import json
  3. 3 with open ('c:/Users/zliyong/filo.txt','a+',encoding='utf-8') as f:
  4. 4 #f.write('first line\nsecondline\n3rd line\n 4rd line')
  5. 5 # f.tell()#查看当前指针位置
  6. 6 # f.seek(2)#指定当前指针位置
  7. 7 ret = f.truncate(100) #从指定位置向前截取
  8. 8 print(f.tell())
  9. 9 print(f.read())
  10. 10 for line in f.readlines():
  11. 11 print(line.strip())

Python3中的文件操作实例

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。

open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()方法就行。

StringIO就是在内存中创建的file-like Object,常用作临时缓冲。

二进制文件

前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可:

  1. 1 >>> f = open('/Users/michael/test.jpg', 'rb')
  2. 2 >>> f.read()
  3. 3 b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
  4. 4
字符编码

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

  1. 1 >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
  2. 2 >>> f.read()
  3. 3 '测试'
  4. 4

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

  1. 1 >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

写文件注意事项:

可以反复调用f.write来进行写文件,但是一定要记得用f.close来关闭文件。因为操作系统在往磁盘里写文件时,往往不会立即写入磁盘,而是放在内存中缓存起来,待空闲了再慢慢进行写操作,所以只有调用f.close()方法才能保证操作系统文件完整写入到磁盘,否则经常会使文件部分写入磁盘,剩下的丢失了。

操作文件和目录

Python中的内置os模块提供了调用系统接口函数的功能,实现简单的系统操作。

  1. 1 >>>import os
  2. 2 >>>os.name() #获取操作系统名字
  3. 3 'nt'
  4. 4 >>> os.environ #获取操作系统全部的环境变量
  5. 5 >>> os.environ.get('PATH')#获取操作系统中某个环境变量的值
  6. 6
  7. 7
  8. 8

注意:操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中。创建、删除目录,路径拼接等可以如下调用:

  1. 1 >>> os.path.abspath('.')
  2. 2 'C:\\Users\\zliyong\\AppData\\Local\\Programs\\Python\\Python35'
  3. 3 >>> os.path.join('Users/zliyong','test.dir') #路径拼接
  4. 4 'Users/zliyong\\test.dir'
  5. 5 >>> os.mkdir('c:/Users/zliyong/test.dir')
  6. 6 >>> os.rmdir('c:/Users/zliyong/test.dir')
  7. 7 >>> os.path.split('c:/Users/zliyong/test.dir')
  8. 8 ('c:/Users/zliyong', 'test.dir')
  9. 9 >>> os.path.splitext('c:/Users/zliyong/test.dir/test.txt')
  10. 10 ('c:/Users/zliyong/test.dir/test', '.txt')
  11. 11 >>> os.rename('c:/Users/zliyong/test.dir','c:/Users/zliyong/pyrename.dir')

但是复制文件的函数居然在os模块中不存在!原因是复制文件并非由操作系统提供的系统调用。理论上讲,我们通过上一节的读写文件可以完成文件复制,只不过要多写很多代码。

幸运的是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充。

  1. 1 import shutil
  2. 2 >>> shutil.copyfile('c:/Users/zliyong/pyrename.dir/test.txt','c:/Users/zliyong/pyrename.dir/test2.txt')
  3. 3 'c:/Users/zliyong/pyrename.dir/test2.txt'

最后看看如何利用Python的特性来过滤文件。比如我们要列出当前目录下的所有目录,只需要一行代码:

  1. 1 >>> [x for x in os.listdir('.') if os.path.isdir(x)]
  2. 2 ['DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
  3. 3 >>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
  4. 4 []

lambda表达式

lambda表达式又称为匿名函数,适用于某些简单函数的语法糖。如下这个lambda表达式结合列表推导式的例子是很tricky的:

  1. 1 >>> result = [lambda x: x + i for i in range(10)]
  2. 2 >>> print(result[0](10))
  3. 3 19
  4. 4 >>> print(result)
  5. 5 [<function <listcomp>.<lambda> at 0x000001D664C7C7B8>, <function <listcomp>.<lambda> at 0x000001D667100F28>, <function <listcomp>.<lambda> at 0x000001D667105048>, <function <listcomp>.<lambda> at 0x000001D6671050D0>, <function <listcomp>.<lambda> at 0x000001D667105158>, <function <listcomp>.<lambda> at 0x000001D6671051E0>, <function <listcomp>.<lambda> at 0x000001D667105268>, <function <listcomp>.<lambda> at 0x000001D6671052F0>, <function <listcomp>.<lambda> at 0x000001D667105378>, <function <listcomp>.<lambda> at 0x000001D667105400>]

首先执行range函数,然后生成10个lamda函,当调用result函数时i=9,所以result是一个10个元素都是19的列表。

递归函数

简单地说,递归就是自己调用自己。

例如阶乘就可以用递归来简单的实现。由阶乘的定义可知fact(n) = fact(n-1)*n(n=1时要作特别处理)。用递归函数可以表达如下:

  1. 1 >>> def fact(n):
  2. 2 if n == 1:
  3. 3 return 1
  4. 4 return fact(n-1)*n
  5. 5
  6. 6 >>> fact(10)
  7. 7 3628800

最典型的应用就是斐波那契数列:

  1. 1 def func(arg1,arg2,stop):
  2. 2 if arg1 == 0:
  3. 3 print(arg1,'\n',arg2)
  4. 4 arg3 = arg1 + arg2
  5. 5 print(arg3)
  6. 6 if arg3 < stop:
  7. 7 func(arg2,arg3,stop)
  8. 8
  9. 9 func(1,0,30)

使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。

针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。

Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。

Python基础:Python函数、文件操作、递归的更多相关文章

  1. python学习笔记-(七)python基础--集合、文件操作&函数

    本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

  2. Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数

    1.        集合 1.1      特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...

  3. Python基础-week03 集合 , 文件操作 和 函数详解

    一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...

  4. python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: #/usr/bin/env ...

  5. Python基础7:文件操作

    [ 文件操作] 1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧 ...

  6. python基础11_函数作用域_global_递归

    看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...

  7. python基础学习笔记——文件操作

    文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...

  8. Python基础知识(八)----文件操作

    文件操作 一丶文件操作初识 ###f=open('文件名','模式',编码): #open() # 调用操作系统打开文件 #mode #对文件的操作方式 #encoding # 文件的编码格式 存储编 ...

  9. python基础八之文件操作

    python的文件操作 1,打开文件 编码方式要和文件的编码方式相同! #open('路径','打开方式','指定编码方式') f = open(r'E:\pycharm\学习\day8\test', ...

  10. Python基础之 一 文件操作

    文件操作 流程: 1:打开文件,得到文件句柄并赋值给一个变量 2:通过句柄对文件进行操作 3:关闭文件 模式解释 r(读) , w(写) ,a(附加)r+(读写的读), w+(读写的写),a+(读附加 ...

随机推荐

  1. scrapy框架爬取小说信息

    1.爬取目标网站:http://www.zhaoxiaoshuo.com/all.php?c=0&o=0&s=0&f=2&l=0&page=1 2.爬取目标网站 ...

  2. Linux常用系统命令大全

    最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大.我将我了解到的命令列举一 ...

  3. cap原则(cap定理)与base理论

    CAP定理c:一致性 Consistency: 分布式系统中,所有数据备份,同一时刻存在一样的值.当在分布式环境中,当一个地方写入返回成功的结果,其他地方也应读取到最新的数据.a:可用性 Availa ...

  4. CSS快速入门-鼠标悬浮(hover伪类)

    一.概述 hover伪类:在鼠标移到元素上时向此元素添加特殊的样式.比较普通的就是一个url,当你鼠标放上去后,会变颜色. 在现实的应用场景也非常之多.最常见的是网站的悬浮导航,当鼠标放到导航条上时, ...

  5. lastIndexOf()

    方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索.

  6. 关于自动化测试框架,所需代码技能,Java篇——参数配置与读取.

    前言: 说在前边.像我这种假期不出去浪,在这里乖乖写文章研究代码的人,绝壁不是因为爱学习,而是自己不知道去哪玩好,而且也不想玩游戏,看电视剧什么的,结果就无聊到看代码了…… 至于如何解读代码,请把它当 ...

  7. C# 通用树形数据结构

    前言 树在图论中是一种重要的图,由于其自身的许多特殊性质,也是一种重要的计算机数据结构,在很多地方都有用.但是这些树大多都是作为其他应用的内部数据结构来使用.我们无法了解这些树的详细信息,而 .Net ...

  8. TPO-22 C1 Complain about a biased article

    /* 加粗:语音部分 * 红色:单词部分 * 斜体:语法部分 * 下划线:信号词/句 */ 第 1 段 1.Listen to a conversation between a student and ...

  9. RabbitMQ入门:总结

    随着上一篇博文的发布,RabbitMQ的基础内容我也学习完了,RabbitMQ入门系列的博客跟着收官了,以后有机会的话再写一些在实战中的应用分享,多谢大家一直以来的支持和认可. RabbitMQ入门系 ...

  10. spring boot 配置全局日期类型转换器

    1. 首先自定义一个类型转换器 import org.springframework.core.convert.converter.Converter; import org.springframew ...