python 函数、file、OS模块

Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但也可以自己创建函数,这被叫做用户自定义函数。

1.函数的定义:

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • pass 关键字,代表什么都不干
  • exit(num) 强行退出(num:是一个数字,显示为退出码)
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

语法

def functionname( parameters ):
  function_suite
  return [expression]

默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。

举例1:

def add(x, y):
print(“x = {0}”.format(x))
print(“x = {0}”.format(x))
print(“x  + y  = {0}”.format(x+y))
return x+y

举例2:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/14 20:31
# @Author  : Feng Xiaoqing
# @File    : demo1.py
# @Function: -----------


def f(x,l=[]):
   for i in range(x):
       l.append(i*i)
   print(l)

# f(2) = f(2, l=[])

f(2)
# 结果:[0, 1]

f(3,[3,2,1])
# 结果: [3, 2, 1, 0, 1, 4]

f(x=3, l=[])
# 结果: [0, 1, 4]

运行结果:

[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 4]

2.函数的调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

如下实例调用了add()函数:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/15 21:01
# @Author  : Feng Xiaoqing
# @File    : demo2.py
# @Function: -----------

# 自定义加法函数add()
def add(x,y):
   print("{0} + {1} = {2}".format(x,y,x+y))
   return
   print("finished")   #在return后不会执行这条语句


# 调用函数,计算2+3的得数
add(2,3)

运行结果:

2 + 3 = 5

3.函数的参数

形式参数和实际参数

在定义函数时,函数名后面,括号中的变量名称叫做形式参数,或者称为"形参"

在调用函数时,函数名后面,括号中的变量名称叫做实际参数,或者称为"实参"

def fun(x,y):  //形参
   print(x + y)
   fun(1,2)     //实参
   3
   fun('a','b')
   ab

函数默认参数:

缺省参数(默认参数)

def fun(x,y=100)    
 print x,y

#调用:
fun(1,2)
fun(1)

定义:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def fun(x=2,y=3):
 print x+y

调用:

fun()
#结果:
5

fun(23)
#结果
26

fun(11,22)
#结果:
33

我们经常在看别人的代码中,经常出现def(*args, **kwargs)这样的表现形式:

*args             指的是:tuple  (1, )
**kwargs       指的是:dict   {“k”: “v”}

fun(*args, **keargs)
fun(1, 2, 3, 4, 5, a=10, b=40)

4.函数的返回值

函数返回值:

函数被调用后会返回一个指定的值

函数调用后默认返回None

return返回值

返回值可以是任意类型

return执行后,函数终止

return与print区别

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def fun():
 print 'hello world'
 return 'ok'
 print 123

fun()

#结果
hello world
123
None

5.函数的变量

局部变量和全局变量:

Python中的任何变量都有特定的作用域

在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量

在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序所使用的变量称为全局变量。

def fun():
  x=100
  print x

fun()
x = 100

def fun():
  global x   //声明
  x +=1
  print x

fun()
print x

外部变量被改(x由100改为101):

x = 100

def fun():
 global x
 x += 1
 print (x)

fun()
print (x)

#结果
101
101

内部变量外部也可用:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/15 21:33
# @Author  : Feng Xiaoqing
# @File    : demo2.py
# @Function: -----------

x = 100

def fun():
   global x
   x +=1
   global y
   y = 1
   print(x)

fun()
print(x)
print(y)

#结果:
101
101
1

统计程序中的变量,返回的是个字典

#!/usr/bin/env python
# -*- coding:utf-8 -*-

x = 100
def fun():
   x = 1
   y = 1
   print(locals())

fun()
print (locals())

结果:

{'y': 1, 'x': 1}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x02FF6390>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/PycharmProjects/PythonLive/untitled/day07/demo2.py', '__cached__': None, 'x': 100, 'fun': <function fun at 0x052D2390>}

6.匿名函数

顾名思义就是没有名字的函数,那为什么要设立匿名函数,他有什么作用呢?
lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方

python 使用 lambda 来创建匿名函数。

  • lambda只是一个表达式,函数体比def简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

语法

lambda函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

举例:

求两数的乘积:

常规写法:

def fun(x,y)
 return x*y

lambda版本写法:

r = lambda x,y:x*y

7.高阶函数

(1)map(f, list)

返回每个元素通过f计算完的value的list

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

举例:计算列表里值的平方

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def f(x):
   return x*x

for i in map(f,[1,2,3,4,5,6,7]):
   print(i)

结果:

1
4
9
16
25
36
49

(2)reduce(f,list)函数(求list中数的和)

reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

举例:计算列表中所有数的和

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from functools import reduce  #导入reduce函数

def f(x,y):
   return x+y
print(reduce(f,[1,2,3,4,5,6,7,8,9,10]))
print(reduce(f,range(1,101)))


#结果:
55
5050

(3)filter()函数(过滤)

filter函数接收一个函数f和一个list,函数f的作用是对每个元素进行判断,返回True或者False,filter()根据判断结果自动过滤掉不符合条件的元素,返回符合要求的元素组成的list

filter(lamdba x: x%2 ==1, [1, 2, 3, 4, 5])

举例:计算list中小于7的数

#!/usr/bin/env python
# -*- coding:utf-8 -*-

for i in filter(lambda x:x<7, [1, 2, 3, 4, 5,40,8]):
   print(i)


#结果:
1
2
3
4
5

(4)sorted()函数(排序)

sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

# sorted(iterable, key, reverse)
# iterable  一个可迭代的对象
# key 对什么进行排序
# reverse  bool类型,如果为true为反序, 默认为false
# 返回值是一个list

举例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/15 22:47
# @Author  : Feng Xiaoqing
# @File    : demo3.py
# @Function: -----------


m = dict(a=1, c=10, b=20, d=15)
print(sorted(m.items(), key = lambda d:d[1],reverse = True)) #按value值倒序排列


#结果:
[('b', 20), ('d', 15), ('c', 10), ('a', 1)]

综述

- file(文件)的含义

Python 中的 file 不止使用 PC 时所说的单个文件,比如 .txt、.exe 等这类文件,也包括“打开一个网址”、程序间的通信数据等,都抽象成 file 的概念。

- 好处

所有的这些数据处理,可以通过一套相同的操作函数进行,简化文件操作逻辑,降低了学习难度。

具体内容

- 基本读写操作

以下是 Python 自带的文件操作函数(即“内建函数”):

  1. open()
    打开文件。如果没有文件,就会新建这个文件。
  2. read()
    读取,官方:输入。输入到编写的程序里面
  3. readline()
    输入一行
  4. seek()
    文件内移动(光标操作位置)
  5. write()
    写入,官方;输出。输出到其他文件中。
  6. close()
    关闭文件。一定要进行的操作,否则文件是“非保存”状态,关机操作会丢失数据。

- 【写入文件】的 demo 说明

整体逻辑:

open() --> write() --> close()
打开 --> 写入内容 --> 保存关闭文件

目标:

记录常见的“英文名字”。

【说明:】不采用中文,是因为中文的字符不是统一的,一个汉字是两个字符位,而标点是一个字符位,不容易理解。

打开(新建)文件:

使用 open() 函数。

# 记录常见的英文名字到 txt 文件中

file_names = open('enNames.txt','w') # 需要添加‘’,说明为 操作标记,否则被认为是 变量

print("file_names 的文件 type 是:")
print(type(file_names))
file_names 的文件 type 是:
<class '_io.TextIOWrapper'>
  • 过程解释:
  • 最完整(冗杂)版本:
    open('enName.txt', mode = 'w')
  • 简略(省略的)版本:
    file 为第一个参数,mode 为第二个参数,不写参数名字,就默认按照参数顺序排列
    open('enName.txt', 'w')
  • file 赋值给一个变量,使用变量操作文件:
    file_names = open('enName.txt','w')
  • “完整”的参数说明:
    open(file, mode, buffering, encoding, errors, newline, ...)
  • 参数名字解释:
    open(file 是处理的文件名字,需要为 str 数据类型,只有这个是必填项(不然干嘛还用这个函数呢);mode 是处理文件的模式,有 'r'(read 只读模式,不能修改里面的数据)、'w'(write 写入模式,清空内容写入)、'a'(不清楚原有内容的写入),不输入就用默认的 r 模式;buffering 后面这些暂时不需要用到,放过)

向 file 内写入内容:

使用 write 函数。

# 向 file_names 文件内写入 “John” 这个名字,string 类型的。
file_names.write('John')
4

关闭、保存文件:

使用 close() 函数。

file_names.close()

- 【读取文件】的 demo 说明

整体逻辑:

open() --> read() --> close()
打开 --> 读取内容 --> 保存关闭文件

目标:

读取到文件内容,并进行打印输出。

code:

# 打开需要操作的文件,赋值给一个变量以便操作
file_2 = open('enNames.txt') # 默认是 r 模式,所以不用书写
# 读取 file_2 内容,也就是 file_names.txt 的内容
# file_2.read()
# 对读取的内容进行输出打印:
print('file_names.txt 的内容是:')
print(file_2.read())
# 关闭保存文件
file_2.close()
file_names.txt 的内容是:
John

- 【增加内容】的 demo 说明

目标1:

在文件原有的内容上增加内容。

code:

# 增加写入 ‘Bob’ 名字
file_3 = open('enNames.txt','a')
file_3.write('Bob')
file_3.close()

# 需要重新定义变量进行查看,原来的模式为 write,是 unreadable 状态
file_4 = open('enNames.txt')

print("新增内容后的全部内容是:")
print(file_4.read())
file_4.close()
新增内容后的全部内容是:
JohnBob

目标2:

增加的内容在新的一行上。

code:

file_5 = open('enNames.txt', 'w')
file_5.write('John\n')
file_5.write('Bob\n')
file_5.write('Jack\n')
file_5.write('Rose\n')
file_5.close()

file_6 = open('enNames.txt')

print("具有多行 string 的内容是:")
print(file_6.read())
file_6.close()
具有多行 string 的内容是:
John
Bob
Jack
Rose

- 【逐行读取】的 demo 说明

目标1:

逐行读取内容,以 string 类型的数据为例子。

code:

file_7 = open('enNames.txt')

print('一行的内容是:')
print(file_7.readline())
print('下一行的内容是:')
print(file_7.readline())

file_7.close()
一行的内容是:
John

下一行的内容是:
Bob

目标2:

批量逐行读取内容,用到 for 函数。

code:

file_8 = open('enNames.txt')
for line in file_8.readlines():
    print('这行的内容是:'+line)
    print('=*=*=*=')

file_8.close()
这行的内容是:John

=*=*=*=
这行的内容是:Bob

=*=*=*=
这行的内容是:Jack

=*=*=*=
这行的内容是:Rose

=*=*=*=

- 定位指针指定位置

【指针】:可以简单理解为我们进行 word 编辑的时候的那个“光标”,位置和 sequence 的下标一样,用数字表示。对应的“函数”是 tell() 。

目标1:

获得指针位置信息。

code:

file_9 = open('enNames.txt', 'rb') # 需要增加 b 字符,才能在后面进行相对偏移的操作,否则没有权限。
print('初始指针位置(应该是 0):')
print(file_9.tell())
print("读取3个字符,内容是:")
print(file_9.read(3)) # read()默认是读取全部内容,增加的数字是指定读取的字符数量。
print("现在的指针位置是:")
print(file_9.tell())
print('再读取4个字符,内容是(我不知道换行符是不是算一个字符):')
print(file_9.read(4))
print("处理两次后,当前的指针位置:")
print(file_9.tell())
初始指针位置(应该是 0):
0
读取3个字符,内容是:
b'Joh'
现在的指针位置是:
3
再读取4个字符,内容是(我不知道换行符是不是算一个字符):
b'n\r\nB'
处理两次后,当前的指针位置:
7

mode = 'r'的情况
【分析:】为什么最后是8,不应该是3+4=7的么?【猜想:】应该是换行符有点特别吧。

mode = 'rb的情况
【分析:】打印的内容为什么出现b''字样?【基本猜测:】b 的意思是 binary mode,即 二级制,需要进行提醒。

目标2:

将指针返回到文件开头。使用的是 seek() 函数。

code:

print("我们进行了 seek() 的操作,seek(0)")
file_9.seek(0) # 输入的数字是定位的位置的数字标记。
print("当前的指针位置是:")
print(file_9.tell())
print("重新定位指针后,读取的两个字符内容是:")
print(file_9.read(2))
print("读取完成后,当前的指针位置是:")
print(file_9.tell())
我们进行了 seek() 的操作,seek(0)
当前的指针位置是:
0
重新定位指针后,读取的两个字符内容是:
b'Jo'
读取完成后,当前的指针位置是:
2

目标3:

在当前位置相对移动指针。

code:

接着上面,指针已经在 2 位置处。

print("当前位置偏移4个字符的 seek() 操作")
file_9.seek(4, 1)
print("当前的指针位置是:%s"%file_9.tell())
print("读取2个字符,内容是:%s"%file_9.read(2))

print("从文件开头位置偏移3个字符的 seek() 操作")
file_9.seek(3, 0)
print("当前的指针位置是:%s"%file_9.tell())
print("读取2个字符,内容是:%s"%file_9.read(2))
print("从文件结尾位置偏移3个字符的 seek() 操作")
file_9.seek(-3, 2)
print("当前的指针位置是:%s"%file_9.tell())
print("读取2个字符,内容是:%s"%file_9.read(2))

file_9.close()
当前位置偏移4个字符的 seek() 操作
当前的指针位置是:6
读取2个字符,内容是:b'Bo'
从文件开头位置偏移3个字符的 seek() 操作
当前的指针位置是:3
读取2个字符,内容是:b'n\r'
从文件结尾位置偏移3个字符的 seek() 操作
当前的指针位置是:20
读取2个字符,内容是:b'e\r'

【参数说明:】

seek

一、为什么我们需要引用os模块

  • 在用python处理数据的过程中,经常需要查找操作文件和路径,这就依赖于os模块,我们今天只梳理最常用最简单的方法。

二、os模块使用方法

2.1、os.getcwd( )方法获取代码当前工作路径

import os
os.getcwd()

os.getcwd( )方法获取代码当前工作路径

2.2、 os.listdir()方法获取当前工作文件夹内的文件夹或文件

import os
os.listdir()

os.listdir()方法获取当前工作文件夹内的文件夹或文件

2.3 、 os.scandir() 方法获取当前工作文件夹内的文件夹或文件

os.scandir('/home/davidwu/kaggle')

os.scandir() 方法获取当前工作文件夹内的文件夹或文件

返回的是可迭代对象对吧?

我们用for循环迭代一下遍出结果

for f in os.scandir():
   if not f.is_file(): #is_file判断是否是文件
       print('yes',f)
   else:
       print('no:', f)

for循环迭代遍历出结果

2.4 、 os.makedirs() # 创建文件夹

os.makedirs("haha1/haha2")  # 创建文件夹

os.makedirs() # 创建文件夹

2.5 、 os.chdir( ) # 创建文件夹

os.chdir('/home/davidwu/kaggle/haha1/haha2')

os.chdir( ) # 创建文件夹

2.6 、 os.path.join() # 路径拼接为

 os.path.join('kaggle', 'kaggle233', 'kaggle666')

2.7 、 os.path.abspath( ) # os.path.abspath(path):返回path的绝对路径。

os.path.abspath("haha1")

返回path的绝对路径

 

2.8 、 os.system(command) #用来运行shell命令。

python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值