零基础入门科研Python:科研编程,从此启航
在当今快速发展的科技时代,编程已成为跨领域研究的关键技能,而Python作为一种强大且易于学习的编程语言,正变得日益流行。对于经济管理和社会科学等非计算机科学领域的研究者来说,掌握Python不仅意味着拓宽研究方法的边界,也代表着在数据驱动的研究领域中保持竞争力。
Python的魅力在于它的简洁性和强大的功能。它的语法清晰易懂,即使是没有任何编程背景的初学者也能快速上手。更重要的是,Python拥有强大的社区支持和丰富的库资源,这些都极大地便利了数据处理、文本分析和可视化等工作,尤其对于经管和社科领域的研究者来说,这意味着能更高效地进行数据挖掘、模式识别和洞见提炼。
本文旨在为零基础的经管、社科科研工作者提供一个明晰而实用的Python入门指南。我们将从Python的基本概念和操作开始,逐步深入到文件处理和异常捕获等高级话题。无论您是希望提高工作效率,还是寻求在科研中采用更先进的数据分析方法,本文都将是您的理想起点。
让我们一起开始这段探索Python的旅程,开启您的编程之路,发现数据分析的无限可能。
Python环境搭建
1. 为什么选择Anaconda
• Anaconda是一个广受欢迎的Python发行版,包含了Python本身及众多流行的科学、数学、工程和数据分析包。
• 安装Anaconda后,不需要单独安装Python,因为Anaconda包含了Python。
2. 下载Anaconda
• 可以从Anaconda的官网(https://www.anaconda.com/products/individual)或国内镜像网站(https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/)下载。国内用户由于网速原因,建议使用国内镜像网站进行下载。
3. 安装Anaconda
• 下载后,找到下载的安装文件并双击打开。
• 同意协议后,根据个人需求选择“All Users”或“Just Me”。
• 如果对计算机或编程不熟悉且C盘空间富裕的同学可以选择将Anaconda安装在C盘,以避免某些错误。但如果C盘空间不足或有其他要求,也可以选择安装在其他盘。
4. 配置环境变量
• 安装过程中,可以选择是否将Anaconda添加到系统环境变量(Add Anaconda3 to the system PATH environment variable)。但是,自动添加的环境变量有时会与电脑本身的环境变量产生冲突或其他问题,因此这里推荐大家不勾选,跟着我们后续的操作手动添加环境变量。
• 手动配置环境变量的步骤是:打开“此电脑”的“属性”,进入“高级系统设置”,找到“环境变量”,然后在“Path”中添加Anaconda的安装路径。
• 需要添加的路径包括Anaconda的根目录以及其下的Scripts、Library\mingw-w64\bin、Library\usr\bin、Library\bin目录。
5. 测试安装是否成功
• 打开命令提示符(在文件导航栏中输入cmd或右键“在此处打开终端”即可),输入python检查是否能够进入Python环境。
• 输入conda info,查看conda的版本信息,确认是否正确安装。
6. 打开jupyter notebook
• 在你希望存放Python文件的地方在文件导航栏中输入cmd,进入命令提示符界面
• 输入jpyter notebook,稍等片刻即可打开网页
• New一个Python3的文件,即可在其中进行代码相关操作
通过以上步骤,即可在Windows系统中成功安装和配置Anaconda,为Python编程提供一个强大且方便的环境。
Python基础语法
0.背景知识
• 解释型语言:Python是一种解释型语言,这意味着代码在运行时被解释,不需要单独的编译过程。
• 跨平台:Python可以在多种操作系统上运行,如Windows、MacOS、Linux等。
• 动态类型:在Python中,你不需要显式声明变量的数据类型,解释器在运行时会自动推断。
• 强类型:Python是一种强类型语言,这意味着类型在运行时总是已知的,且不会自动转换(例如,不能将字符串和整数直接相加)。
• 面向对象:Python支持面向对象的编程范式,这意味着它支持封装、继承和多态等面向对象的特性。
• 注释(计算机不会运行,只给人看的内容):
• 单行注释:使用#开始,例如:# 这是一个注释
• 多行注释:虽然Python没有专门的多行注释语法,但可以使用三个双引号"""或三个单引号'''来创建多行字符串,常被用作多行注释。
• 区分大小写:Python是大小写敏感的语言。例如,变量number和Number会被视为两个不同的变量。
• 缩进:Python使用缩进来定义代码块,这是Python语法的重要特点。例如,在if语句、循环、函数定义中,代码块的缩进级别表明了代码逻辑的层次结构。
1. 变量和数据类型:
• 整数(int):如1, 100, -45。
• 浮点数(float):带有小数点的数字,如3.14, -0.001。
• 字符串(str):文本或字符序列,如"Hello", "Python3"。
• 布尔值(bool):代表真(True)或假(False)的值。
变量: 在Python中,变量可以被视为数据的容器。它们不需要显式声明类型,Python会自动判断。比如下面这个例子中的变量x和变量y。
x = 5 # 整数
y = "Hello" # 字符串
数据类型: 数据类型是变量可以保存的信息类型。主要类型包括:
a = 10 # 整数
b = 5.5 # 浮点数
c = "Python" # 字符串
d = True # 布尔值
2. 基本运算:
• 算术运算符: 包括加(+), 减(-), 乘(*), 除(/), 取余(%), 整除(//)和幂(**)。
sum = 7 + 3 # 结果为 10
diff = 7 - 3 # 结果为 4
product = 7 * 3 # 结果为 21
quotient = 7 / 3 # 结果为 2.333...
remainder = 7 % 3 # 结果为 1
power = 3 ** 2 # 结果为 9
3. 控制流程(循环与判断)
• Python关键字介绍: 到了这一步,我们就需要引入一个新的概念“关键字”(或称“保留字”)
import keyword
print(keyword.kwlist) # print()用来将内容打印到控制台或终端
程序会输出:
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
部分关键字的具体使用场景,我们会在后续的教程中提到。对于没有涉及的部分,大家可以自行搜索。
• Python关键字是保留的词汇,它们具有特殊的含义和用途。如 if, elif, else, for, while 等。
• 关键字不能用作变量名、函数名或任何其他标识符名称。
• 使用 import keyword 和 keyword.kwlist 可以查看Python中所有的关键字。
• if-elif-else 语句:
• 用途:基于不同的条件执行不同的代码块。
• 语法:
if 条件1:
# 条件1为真时执行的代码
elif 条件2:
# 条件2为真时执行的代码
else:
# 所有条件都不为真时执行的代码
• 示例:
age = 20
if age < 18:
print("未成年") # print()能将内容打印到控制台或终端
elif age < 65:
print("成年人")
else:
print("老年人")
• for循环:
• 用途:遍历序列(如列表、字符串等),按顺序执行代码块。
• 语法:
for 变量 in 序列:
# 执行的代码
• 示例:
for i in range(5): # range(5) 生成一个从0到4的序列
print(i)
• while循环:
• 用途:只要条件为真,就重复执行代码块。
• 语法:
while 条件:
# 执行的代码
• 示例:
count = 5
while count > 0:
print(count)
count -= 1 # 减少count的值
这些控制流程的基础知识对于Python初学者来说至关重要,因为它们构成了程序逻辑的核心。通过熟练使用这些结构,新手可以开始编写简单的程序,并逐渐掌握更复杂的编程概念。
以上是Python编程的基础语法内容,是学习更复杂概念和构建实际程序的基础。掌握这些基础知识后,初学者可以开始尝试编写简单的程序,并逐步深入学习。
基础数据结构
1. 列表(List):
• 创建: 使用方括号[]来创建列表,列表中的内容称为列表的“元素”。列表可以包含不同类型的元素。
my_list = [1, 2, 3, "Python", True]
• 访问: 通过索引访问列表元素,索引从0开始。
first_element = my_list[0] # 结果是 1
• 修改: 列表是可变的,可以更改、添加或删除元素。
my_list[0] = 10 # 修改第一个元素
my_list.append("new item") # 添加新元素
del my_list[1] # 删除第二个元素
2. 元组(Tuple):
• 创建: 使用圆括号()来创建元组。元组一旦创建,其内容不能更改。
my_tuple = (1, 2, 3, "Python")
• 访问: 访问方式与列表相同,通过索引。
first_element = my_tuple[0] # 结果是 1
• 不可变性: 一旦创建,元组中的元素不能更改。
my_tuple[0] = 10 # 这会引发错误
3. 字典(Dictionary):
• 创建: 字典由键值对组成,使用大括号{}来创建。
my_dict = {"name": "Alice", "age": 25, "language": "Python"}
• 访问: 通过键来访问相应的值。
name = my_dict["name"] # 结果是 "Alice"
• 修改: 可以添加新的键值对,或修改现有的值。
my_dict["age"] = 26 # 修改已有键的值
my_dict["profession"] = "Programmer" # 添加新的键值对
列表、元组和字典是Python中最常用的数据结构,它们分别在不同的场景下发挥着重要的作用,如列表和字典在数据存储和处理中尤为常见,而元组则适用于创建不可更改的数据集合。
当然,我会更详细地解释函数和模块的概念,特别是针对零基础的初学者。
函数
1. 定义函数:
• 使用def关键字开始一个函数定义,后跟函数名和括号内的参数列表。
• 函数体是一系列在函数调用时执行的语句。
• return语句用于从函数返回一个值。如果没有return语句,函数将返回None(Python的空值)。
• 示例:
def add(a, b):
result = a + b
return result
2. 调用函数:
• 函数定义后,可以通过其名称和传递适当参数来调用。
• 调用函数时,参数的值会传递给函数中的相应参数。
• 示例:
sum = add(5, 3) # 调用函数add,传入5和3作为参数
print(sum) # 输出结果 8
模块
1. 模块的基本概念:
• 模块是一个包含Python定义和语句的文件。模块可以定义函数、类和变量,也可以包含可执行的代码。
• 模块的主要目的是帮助组织代码并促进代码复用。
2. 导入模块:
• 使用import语句导入模块。例如,导入math模块。
• 一旦导入了模块,就可以使用该模块中定义的函数、类和变量。
• 示例:
import math
result = math.sqrt(16) # 调用math模块中的sqrt函数计算16的平方根
print(result) # 输出结果 4.0
通过理解函数和模块,初学者可以开始构建更结构化、模块化和可复用的代码,这对于编程来说是非常重要的基础知识。
文件读写操作
使用Python进行文件读写需要记住以下的简称
模式 描述
'r' 只读模式。如果文件不存在,会产生错误。
'w' 写入模式。如果文件存在,覆盖原有内容;如果文件不存在,创建新文件。
'a' 追加模式。如果文件存在,写入内容追加到文件末尾;如果文件不存在,创建新文件。
'r+' 读写模式。可以读取和写入文件,如果文件不存在,会产生错误。
'w+' 写读模式。可以写入和读取文件,行为类似'w'。
'a+' 追加和读取模式。类似'a',但也可以读取文件。
这些模式提供了在处理文件时不同的读写权限和行为,选择适当的模式对于文件操作非常重要。
1. 打开文件:
• 使用open函数打开文件。需要指定文件名和模式(如'r'表示读取,'w'表示写入)。
• 示例:
file = open('example.txt', 'r') # 打开文件用于读取
2. 读取文件:
• 使用read, readline, 或 readlines方法读取文件内容。
• read()读取整个文件,readline()读取下一行,readlines()读取所有行并返回列表。
• 示例:
content = file.read() # 读取整个文件内容
print(content)
3. 写入文件:
• 使用write或writelines方法写入文件。
• 如果文件以写入模式('w')打开,写入内容会覆盖原有内容。
• 示例:
file = open('example.txt', 'w')
file.write('Hello, Python!') # 写入内容
4. 关闭文件:
• 使用close方法关闭文件。这是一个好习惯,可以释放系统资源。
• 示例:
file.close()
5. 处理CSV文件:
• CSV(逗号分隔值)文件通常用于存储表格数据。
• Python的csv模块可以用于读取和写入CSV文件。
• 示例:
import csv
with open('example.csv', mode='r') as file:
csv_reader = csv.reader(file)
for row in csv_reader:
print(row) # 打印CSV文件的每一行
在使用文件时,建议使用with语句,这样可以确保文件在使用后正确关闭。例如:
with open('example.txt', 'r') as file:
content = file.read()
print(content)
这样做可以自动处理文件的关闭,即使在读取文件时发生异常也是如此。
异常捕获操作
1. 异常和错误的基本概念:
• 在Python中,异常是在程序运行时发生的错误,它中断了正常的程序流程。
• 常见的异常包括ZeroDivisionError(除以零错误)、IndexError(索引超出范围)、FileNotFoundError(文件未找到)等。
下面是一个表格,列出了一些常见的Python异常及其对应的解释:
异常类型 描述
ZeroDivisionError 当除数为零时引发。
IndexError 在使用序列中不存在的索引时引发。
KeyError 在字典中查找不存在的键时引发。
FileNotFoundError 在尝试打开不存在的文件时引发。
ValueError 当函数接收到具有正确类型但不适当的值时引发。
TypeError 当操作或函数应用于不适当类型的对象时引发。
NameError 尝试访问未声明的变量时引发。
IOError 在输入输出操作失败时引发,如“文件未找到”或“磁盘已满”。
对于不确定的异常类型,可以使用一个通用的except块来捕获所有异常,并通过打印异常信息来了解发生了什么问题。例如:
try:
# 可能引发异常的代码
except Exception as e:
print("An error occurred:", e)
这种方法可以捕获任何异常,并将其作为字符串输出,有助于调试和错误处理。
2. 使用try-except语句处理异常:
• try块允许你测试代码块的错误。
• except块让你处理错误。
• 你可以指定想要捕获的特定异常,或使用一个通用的except来捕获所有异常。
• 示例:
try:
result = 10 / 0
except ZeroDivisionError:
print("You can't divide by zero!")
3. 异常处理的实际案例:
• 在处理文件读写时,可能会遇到FileNotFoundError或IOError。
• 使用try-except处理文件读写中的异常,可以防止程序因错误而崩溃,并给用户友好的错误信息。
• 示例:
try:
with open('non_existent_file.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("Sorry, the file does not exist.")
通过异常处理,程序能够优雅地处理运行时错误,并保证程序的稳定性和可靠性。
综合实战
题目:一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
要求:
1、使用循环(for循环或while循环皆可)
2、程序输出如下格式:
出发时共赶x只鸭子。
经过第1个村庄卖了y只鸭子,剩余z只鸭。
经过第2个村庄卖了y'只鸭子,剩余z'只鸭。
……
经过第n个村庄卖了Y只鸭子,剩余Z只鸭。
最后的结果应该是:
出发时共赶510只鸭子。
经过第1个村庄卖了256只鸭子,剩余254只鸭。
经过第2个村庄卖了128只鸭子,剩余126只鸭。
经过第3个村庄卖了64只鸭子,剩余62只鸭。
经过第4个村庄卖了32只鸭子,剩余30只鸭。
经过第5个村庄卖了16只鸭子,剩余14只鸭。
经过第6个村庄卖了8只鸭子,剩余6只鸭。
经过第7个村庄卖了4只鸭子,剩余2只鸭。
大家可以自行思考。这里我就直接放出代码了:
while循环
def duck2(village_count, duck_num, process=''):
"""
使用 while 循环计算并打印赶鸭子的过程。
:param village_count: 要经过的村子数
:param duck_num: 当前剩余的鸭子数
:param process: 到目前为止的过程记录(字符串)
"""
while village_count > 0:
pre_duck_num = 2 * (duck_num + 1)
sold = pre_duck_num - duck_num
process = f'\n经过第{village_count}个村庄卖了{sold}只鸭子,剩余{duck_num}只鸭。' + process
duck_num = pre_duck_num
village_count -= 1
print(f'出发时共赶{duck_num}只鸭子。' + process)
for循环
def duck3(village_count, duck_num, process=''):
"""
使用 for 循环计算并打印赶鸭子的过程。
:param village_count: 要经过的村子数
:param duck_num: 当前剩余的鸭子数
:param process: 到目前为止的过程记录(字符串)
"""
for i in range(village_count, 0, -1):
pre_duck_num = 2 * (duck_num + 1)
sold = pre_duck_num - duck_num
process = f'\n经过第{i}个村庄卖了{sold}只鸭子,剩余{duck_num}只鸭。' + process
duck_num = pre_duck_num
print(f'出发时共赶{duck_num}只鸭子。' + process)
思考进阶
最后,留给大家一个进阶的思考题:递归
递归是一种在编程中常用的方法,它允许函数调用自身。简单来说,递归就是解决问题的方法,它将问题分解为更小的、更易于管理的相似问题,直到达到一个简单的情况,该情况可以直接解决而不需要进一步分解。
例如,一个经典的递归例子是计算阶乘。阶乘的定义是一个数的阶乘等于它乘以它减一的阶乘,直到达到1的阶乘。在递归中,这可以表示为:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
在这个例子中,factorial函数调用自身来计算更小数值的阶乘,直到它到达基本情况(n == 1),然后开始返回计算结果。递归是一个强大的工具,但它也需要谨慎使用,因为如果没有正确的基本情况或者没有正确向基本情况进展,它可能导致无限循环。
综合实战的题目,我们也可以使用以下代码解决,请大家仔细分析和思考代码的逻辑:
def duck(village_count, duck_num, process=''):
"""
计算并打印赶鸭子的过程。
:param village_count: 要经过的村子数
:param duck_num: 当前剩余的鸭子数
:param process: 到目前为止的过程记录(字符串)
"""
pre_duck_num = 2 * (duck_num + 1) # 计算到达当前村庄时的鸭子数目
# 终止条件:所有村庄都已经经过
if village_count == 0:
print(f'出发时共赶{duck_num}只鸭子。' + process)
else:
# 计算并记录卖出的鸭子数目
sold = pre_duck_num - duck_num
process = f'\n经过第{village_count}个村庄卖了{sold}只鸭子,剩余{duck_num}只鸭。' + process
# 递归调用,处理下一个村庄
duck(village_count - 1, pre_duck_num, process)