文章目录

  • 1.函数
    • 1.1函数的引入
    • 1.2变量的作用域
    • 1.3参数传递
    • 1.4常见的四类形参
    • 1.5匿名函数
    • 1.6匿名函数对应的leecode题目
    • 1.7递归函数
    • 1.8递归实现fib数列
  • 2.文件操作
    • 2.1文件的基本操作
    • 2.2with语句
    • 2.3os模块
    • 2.4_json模块
    • 2.5存储为excel文件

1.函数

1.1函数的引入

0.常用的内置函数:
max,min,sum, divmod
#函数必须有输入和输出。

max_num = max(1, 2, 3)
print(max_num)          #3

1.如何创建函数?定义函数,函数内容并不会执行
函数的输入专业叫参数, 函数的输出叫返回值。
重点:

  • 形参: 形式参数,不是真实的值(定义函数时的参数)
  • 实参:实际参数, 是真实的值(调用函数时的参数)
def get_max(num1, num2):result = num1 if num1 > num2 else num2return result

2. 如何调用函数?

max_num = get_max(30, 80)
print(max_num)

1.2变量的作用域

可变数据类型:list, dict,set
不可变数据类型: 数值型, str, tuple

1. 全局变量: 全局生效的变量。函数外面的变量。

name = 'admin'
def login():print(name)
login()


2. 局部变量: 局部生效的变量。函数内部的变量。

def logout():age = 19print(age)
logout()
print(age)


3. 函数内部修改全局变量

  • money是局部变量还是全局变量? 全局变量
  • 如果要在函数中修改全局的变量,不能直接修改。 需要用global关键字声明修改的变量是全局变量。
  • 不可变数据类型修改全局变量一定要global声明, 可变数据类型不需要。
def hello():global moneymoney += 1users.append('user1')print(money, users)
money = 100  # 不可变数据类型
users = []  # 可变数据类型
hello()


函数内的i局部变量互不影响

1.3参数传递

  1. 形参和实参
  1. 参数检查:isinstance(var, int)判断变量var是否为int
def get_max(num1:int, num2:int)->int:             #期望传入参数为整型"""求两数的最大值:param num1: 整型数1:param num2: 整型数2:return: 最大值"""if isinstance(num1, int) and isinstance(num2, int):      #判断是否都是整型return num1 if num1 > num2 else num2else:return  0
result = get_max(20, 30)
print(result)
print(help(get_max))            #help(函数)可以将函数内引号内容打印出来

1.4常见的四类形参

必选参数:必须要传递的参数
默认参数:
可变参数:*args - 元组
关键字参数:**kwargs - 字典

1. 必选参数:必须要传递的参数

def get_max(num1: int, num2: int) -> int:return num1 if num1 > num2 else num2result = get_max(20, 30)
print(result)


2. 默认参数:可传可不传的参数

def pow(x, y=2):return x ** yresult = pow(3)  # x=3, y=2, result=9
print(result)
result = pow(2, 4)  # x=2,y=4, result=2**4=8
print(result)


3. 可变参数: 参数的个数会变化,可以传0,1,2,3,…n

#args是元组
#args=arguments
def my_sum(*args):return sum(args)result = my_sum(4, 5, 6)  # 15
print(result)


4. 关键字参数:可以传递key和value

#kwargs存储在字典中
def enroll(name, age=18, **kwargs):print(f"""入学信息1. 姓名:{name}2. 年龄:{age}3. 其他:{kwargs}""")enroll('张三', country='china', english='GRE', sports=['篮球', '羽毛球'])from collections import  namedtuple

1.5匿名函数

匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,一般比较短,无需特别定义

def get_max(num1: int, num2: int) -> int:return num1 if num1 > num2 else num2

lambda改写后:

get_max = lambda num1, num2: num1 if num1 > num2 else num2
print(get_max(10, 20))
def pow(x, y=2):return x ** y

改写后:

pow = lambda x, y=2: x ** y
print(pow(4))
print(pow(2,3))

1.6匿名函数对应的leecode题目

给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
- 输入: 数组的记录;0 7 0 2
- 输出: 调整后数组的内容; 7 2 0 0
0 7 0 2 -before sort
=====
1 0 1 0 - rule: (1 if num==0 else 0)
0 0 1 1
=====
7 2 0 0 -after sort

nums = [0, 7, 0, 2]
nums.sort(key=lambda num: 1 if num==0 else 0)
print(nums)#需求: 将所有的偶数排前面,所有的奇数排后面。
nums = [0,7,0,2]
nums.sort(key=lambda num: 0 if num%2==0 else 1)
print(nums)


sorted()函数可以自定义参数,使得数组按自定义规则排序,但是并不改变原数组内容

1.7递归函数

函数可以调用函数。结论: 一个函数在内部调用自己本身,这个函数就是递归函数。
需求: 计算阶乘 factorial: n! = 1 * 2 * 3 * … * n
Leetcode 二叉树的题目, 大部分需要用递归。
需求: 求n的阶乘。 n!=n*(n-1)(n-2)…1

方法1: for循环

res = 1
n = 3                  # 3!=3*2*1=1*2*3=6
for i in range(1,n+1):res = res * i # res=1*1*2*3
print(res)

2. 方法2: 递归

  • 递归的规律
  • 退出递归的条件
    3! = 3 * 2! = 3 * 2 * 1! = 6
    n! = n*(n-1)!
def f(n):"""计算阶乘"""if n == 1:return  1return n * f(n-1)
print(f(5))

重点: return n * f(n-1)

1.8递归实现fib数列

def fib(n):"""fib数列"""if n == 1 or n == 2:return  1return  fib(n-1) + fib(n-2)#1, 1, 2, 3, 5, 8
print(fib(5))

2.文件操作

  • 默认数据是加载到内存中,结果也是保存到内存中, 程序执行结束,所有的数据释放。
  • 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。
    open(文件名,访问模式) e.g. f = open(‘test.txt’, ‘w’)
    如果文件不存在那么创建,如果存在那么就先清空,然后写入数据

2.1文件的基本操作

  1. 打开文件

mode:
r: 只能读文件
w: 只能写入(清空文件内容)
a+: 读写(文件追加写入内容)

f = open('doc/hello.txt',mode='a+')

注:
2. 文件读写操作

print(f.read())      #读
f.write('java\n')     #写

3. 关闭文件

f.close()

注:文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

2.2with语句

python引入了with语句来自动帮助我们调用close()方法

python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定的(“清理”)操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。

在此涉及指针,with语句写入文件时,指针默认停留在内容末尾处,此时read函数不能读取指针之前的内容,需要调整指针位置:

seek(offset, from)有2个参数: offset:偏移量 from:方向

  • 0:表示文件开头;
  • 1:表示当前位置;
  • 2:表示文件末尾
with open('doc/test.txt', 'w+') as f:f.write('hello world\n')         # 写入文件f.seek(0, 0)               # ****: 移动指针到文件最开始print("当前指针的位置:", f.tell())f.seek(0, 2)      # 移动指针到文件末尾print("当前指针的位置:", f.tell())print(f.read())         # 读取文件内容

2.3os模块

os,语义为操作系统,处理操作系统相关的功能,可跨平台。 比如显示当前目录下所有文件/删除某个文件/获取文件大小

import  os
import platform

1. 获取操作系统类型

print(os.name)

2. 获取主机信息,windows系统使用platform模块, 如果是Linux系统使用os模块

try: 可能出现报错的代码
excpt: 如果出现异常,执行的内容
finally:是否有异常,都会执行的内容

try:uname = os.uname()
except Exception:uname = platform.uname()
finally:print(uname)

3.获取系统的环境变量

envs = os.environ
#os.environ.get('PASSWORD')
print(envs)

4. 目录名和文件名拼接
#os.path.dirname获取某个文件对应的目录名
#__file__当前文件
#join拼接, 将目录名和文件名拼接起来。

BASE_DIR = os.path.dirname(__file__)
setting_file = os.path.join(BASE_DIR, 'dev.conf')
print(setting_file)

2.4_json模块

import json

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。
这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

1. 将python对象编码成json字符串

users = {'name':'westos', "age":18, 'city':'西安'}
json_str = json.dumps(users)           #将python字符串通过dumps转换为json字符串
with open('doc/hello.json', 'w') as f:# ensure_ascii=False:中文可以成功存储# indent=4: 缩进为4个空格json.dump(users, f, ensure_ascii=False, indent=4)print("存储成功")
print(json_str, type(json_str))

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
  • ensure_ascii=False: 中文存储需要设定为关闭
  • indent=4: 增加缩进,增强可读性,但缩进空格会使数据变大
  • separators=(’,’,’:’): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号
  • sort_keys=True: 字典排序

2. 将json字符串解码成python对象

with open('doc/hello.json') as f:python_obj = json.load(f)print(python_obj, type(python_obj))

2.5存储为excel文件

如何安装pandas?

pip install pandas -i https://pypi.douban.com/simple

如何安装对excel操作的模块?

pip install openpyxl -i https://pypi.douban.com/simple

将下述信息存为excel:

import pandas
hosts = [{'host':'1.1.1.1', 'hostname':'test1', 'idc':'ali'},{'host':'1.1.1.2', 'hostname':'test2', 'idc':'ali'},{'host':'1.1.1.3', 'hostname':'test3', 'idc':'huawei'},{'host':'1.1.1.4', 'hostname':'test4', 'idc':'ali'}
#1. 转换数据类型
df = pandas.DataFrame(hosts)
print(df)#2. 存储到excel文件中
df.to_excel('doc/hosts.xlsx')
print('success')


Python入门5:函数/文件相关推荐

  1. Python入门 NUMECA计算文件处理(一)

    Python入门 NUMECA计算文件处理(一) 批量处理mf文件 读取指定文件目录(包括子目录)下的 "*.mf"文件,并提取指定行到excel表格 思路 os.walk 递归遍 ...

  2. Python入门教程之文件读写操作知识

    Python是随着人工智能时代的来临而火爆起来的编程语言,入门简单.功能强大,吸引了人们的广泛学习加入.想要学好Python,一定要从基础学起,然后进阶深入学习,今天千锋小编就给大家分享Python培 ...

  3. Python 入门 之 函数

    Python 入门 到 精通 (四) 函数基本知识 递归函数 Lambda(匿名函数) 实例运用 本篇文章重点讲解 Python 函数 的以下内容: 定义函数语法.调用函数.函数参数.参数的传递方式. ...

  4. Python的open函数文件读写线程不安全,logging模型文件读写线程安全!

    工作中遇到的问题:如何在多线程的程序中同时记录日志? 最初图省事,使用了最原始的open函数来写日志,因为开始使用的写文件模式的是追加('a'),发现并没有线程不安全的现象,各个线程的的日志信息都写入 ...

  5. python以追加方式打开文件 线程安全吗,Python的open函数文件读写线程不安全,logging模型文件读写线程安全!...

    工作中遇到的问题:如何在多线程的程序中同时记录日志? 最初图省事,使用了最原始的open函数来写日志,因为开始使用的写文件模式的是追加('a'),发现并没有线程不安全的现象,各个线程的的日志信息都写入 ...

  6. Python入门:操作文件

    一.文件分类 文本文件:由单一特定编码组成的文件,比如utf-8 编码.GBK 编码等,.py 与 .txt 等都属于文本文件.但是文本文件本质上是以二进制形式存储的. 二进制文件:直接由 0 和 1 ...

  7. python入门三:文件操作

    一.文件操作 1.文件对象:和c一样,要想对一个文件进行操作,需要获取该文件的对象 1 f = open("xxx") # 打开文件并获取文件对象 2 f.xxx # 对文件进行某 ...

  8. Python 入门学习10 —— 文件操作的应用及升级版三级菜单

    一.文件操作的基本流程 open( )   open( ) 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError. open(f ...

  9. Python入门之函数结构——第3关:函数的使用范围:Python作用域

    任务描述 函数是有使用范围的,在一个模块中,我们可以定义很多函数和变量,但我们希望有的函数和变量别人可以使用,有的函数和变量仅仅可以在模块内部使用.这就是Python作用域的相关问题. 本关的目标就是 ...

  10. python入门之函数结构函数的参数_python3基础之函数参数类型

    函数的参数是函数内部与外部交流的纽带,上一篇文章我们使用了最简单的参数形式(就一个参数).接下来测试一下多个参数的情况是怎样的? 1.测试1 例子中使用了两个参数p1和p2, 函数的功能就是打印出p1 ...

最新文章

  1. 系统试图将驱动器合并到合并驱动器上的目录_系统小技巧:“徒手”创建可启动的VHD系统...
  2. node.js async await 配合Promise对象使用
  3. 阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?...
  4. libevent 接收TCP连接
  5. git 暂存本地修改的文件
  6. 机器学习笔记(《统计学习方法》李航and《机器学习》周志华)
  7. 16_多易教育之《yiee数据运营系统》用户画像-标签体系设计篇
  8. 使用百度云AI C++SDK在windows上进行在线语音识别
  9. S2Snet:利用纳米孔进行低分子量RNA鉴定的深度学习
  10. Java读写Excel之HSSFWorkbook、XSSFWorkbook、Workbook
  11. 用dom4j实现对象和xml文件的互相转换
  12. 微信定位精灵服务器或网络异常,为什么微信定位精灵定位不了怎么办?
  13. js截取字符串的后几位数 省份证号*隐藏
  14. ON1 Effects 2021.5 v15.5.0.10403 中文版 照片滤镜/LUT/纹理处理工具
  15. 基于号段模式、百度UID实现的分布式ID生成器kylin-id
  16. Incorrect string value: ‘\xE4\xB8\xAD\xE5\x9B\xBD‘ for column ‘nation‘ at row 1
  17. kubernetes1.15.0高可用(keepalived+haproxy)
  18. 乔治华盛顿大学计算机学院吧,GWU的Computer Science「乔治华盛顿大学计算机科学系」...
  19. rtmp和http flv协议总结
  20. 3个快速验证产品想法的实例

热门文章

  1. 80后的100个习惯
  2. n分频器 verilog_verilog实现简单分频器
  3. 爱你的男人,会主动给你的
  4. php volist模板,ThinkPHP 模板 Volist 标签嵌套循环输出多维数组
  5. Java初级工程师面试题(一)
  6. 如何测量微型真空泵的瞬时压力
  7. 一键隐藏kodi 一键隐藏app amlogic rockchip tvbox
  8. 隐藏SSID和STA搜索隐藏SSID原理
  9. vscode中怎样格式化js代码_如何在Visual Studio代码(VSCode)中格式化代码
  10. 利用exe4j生成java的exe文件