小菜鸟

java菜鸟号正在起航

Python 高阶函数:把函数当”变量”用,代码能少写一半

写 Python 的时候,你可能已经不经意间用过高阶函数了——比如 map()filter()sorted()key 参数。它们的特点是:把一个函数作为参数传给另一个函数

说白了,高阶函数就是”能操作函数的函数”。就像你把一个数据传给函数处理一样,高阶函数让你把处理逻辑本身传给另一个函数。

这东西为什么有用?因为它把”做什么”和”怎么做”分开了——你告诉我规则,我按规则处理数据。

函数也是”值”,可以传来传去

在 Python 里,函数跟数字、字符串一样,也是对象。你可以把它赋值给变量、放进列表、当成参数传给别的函数。

def square(x):
    return x ** 2

# 函数可以赋值给变量
f = square
f(5)   # 25

# 函数可以放进列表
funcs = [square, abs, len]
funcs[0](4)   # 16

能当参数传,就有了高阶函数:

def apply(func, value):
    return func(value)

apply(square, 5)   # 25

这个 apply 就是高阶函数——它接收了一个函数参数,在内部调用了它。

map:挨个处理,批量转换

map(func, iterable)func 应用到可迭代对象的每一个元素上,返回一个新的迭代器。

把列表里每个数字都平方:

nums = [1, 2, 3, 4]
squares = map(lambda x: x ** 2, nums)
list(squares)   # [1, 4, 9, 16]

把字符串列表转成整数:

str_nums = ["12", "34", "56"]
int_nums = map(int, str_nums)
list(int_nums)   # [12, 34, 56]

这里 int 本身就是一个函数,直接传给 map,省了写 lambda。

两个列表对应相加:

a = [1, 2, 3]
b = [4, 5, 6]
sums = map(lambda x, y: x + y, a, b)
list(sums)   # [5, 7, 9]
阅读全文 »

Python 模式匹配:从 in 到正则再到 match-case,一招对一招

处理文本和数据,绕不开匹配这件事——判断一段文字里有没有某个词、提取一个手机号、解析一段 JSON 结构。

Python 提供了三个层级的工具:字符串方法(最基础)、正则表达式(最强大)、match-case 结构化匹配(Python 3.10+,专门对付数据结构)。遇到什么场景用什么工具,比学会所有工具的语法更重要。

最简单的:字符串自带的方法

能用内置方法解决的问题,就别上正则。代码短、速度快、不用记那些奇怪的符号。

1. 有没有:innot in

text = "hello world, hello python"

if "hello" in text:
    print("找到了")

这是最直观的写法,没有之一。find() 也可以,但 in 更符合直觉。

2. 在哪:find()rfind()

text.find("hello")     # 0,第一次出现的位置
text.rfind("hello")    # 13,从右边找
text.find("java")      # -1,找不到返回 -1

如果你还需要知道位置,用 find()。注意它返回 -1 表示没找到,不是抛异常。

3. 开头结尾:startswith()endswith()

url.startswith("https")              # True
filename.endswith(".txt")            # True

# 可以传元组,匹配任意一个
url.startswith(("http://", "https://"))  # True
filename.endswith((".txt", ".md"))       # True

批量处理文件的时候非常好用:

files = ["data.txt", "image.png", "notes.md"]
txt_files = [f for f in files if f.endswith(".txt")]

文件名通配符:fnmatch

如果你需要 *? 这种简单的通配符,又不想写正则,fnmatch 是折中方案。

from fnmatch import fnmatch

fnmatch("document.txt", "*.txt")     # True
fnmatch("config.json", "config.*")   # True

# 批量过滤
files = ["main.py", "utils.py", "test.py"]
py_files = [f for f in files if fnmatch(f, "*.py")]
阅读全文 »

Python 字符串:处理文本的这几十种方法,其实常用的就那些

写 Python 代码,字符串操作避不开。解析日志、处理用户输入、拼 SQL、格式化输出——天天都在跟文本打交道。

Python 的字符串方法多,但常用的就那么十几个。

字符串是什么,记住两点就够了

  • 不可变
s = "hello"
# s[0] = "H"   # 报错!不能直接改

# 想改?创建新字符串
s = "H" + s[1:]   # "Hello"

字符串一旦创建就不能改,所有”修改”操作都是创建新字符串。记住这点,写代码的时候就不会困惑了。

  • 序列,可以索引和切片
s = "Python"
s[0]    # "P",从0开始
s[-1]   # "n",倒数第一个
s[1:4]  # "yth",从索引1到3,左闭右开
s[::-1] # "nohtyP",反转

切片是字符串最常用的操作之一,记住 [start:stop:step] 左闭右开就行。

查和找:在一段文本里找东西

判断开头结尾:

url = "https://example.com"

url.startswith("https")   # True
url.endswith(".com")      # True

找子串的位置:

text = "hello world, hello python"

text.find("world")    # 6,返回第一次出现的位置
text.find("java")     # -1,找不到返回-1
text.rfind("hello")   # 13,从右边找

# 如果确定存在,用 index(找不到会报错)
text.index("world")   # 6

日常用 find 就够了,返回 -1 表示没有。index 会抛异常,除非你很确定那个子串一定存在。

统计出现次数:

text.count("hello")   # 2
text.count("o")       # 4

检查是否包含某个子串:

if "world" in text:
    print("找到了")

if "java" not in text:
    print("没有")

innot infind() != -1 更直观,推荐用这个。

改:替换、大小写、去空格

替换:

text = "hello world, hello python"
text.replace("hello", "hi")          # "hi world, hi python"
text.replace("hello", "hi", 1)       # "hi world, hello python",只替换第一个
阅读全文 »

Python 循环:重复的事交给代码去做

写程序,大量的事情都是重复的——遍历列表里的每个元素、处理文件的每一行、一直等到某个条件满足。

Python 给了你两种方式做重复的事:for 循环和 while 循环。什么时候用哪个,判断标准就一条:知道要遍历什么用 for,知道要等到什么时候用 while

for 循环:给我一个集合,我挨个处理

for 循环的核心是”遍历”——你给我一个列表、字符串、字典、或者任何”可迭代”的东西,我一个一个取出来处理。

遍历列表:

students = ["张三", "李四", "王五"]

for name in students:
    print(f"当前学生:{name}")

遍历字符串:按字符遍历

for char in "Python":
    print(char)   # P, y, t, h, o, n

遍历字典:默认遍历键

scores = {"张三": 95, "李四": 88}

for name in scores:          # 遍历键
    print(name)              # 张三, 李四

for score in scores.values(): # 遍历值
    print(score)             # 95, 88

for name, score in scores.items():  # 遍历键值对
    print(f"{name}: {score}")

遍历 range:固定次数循环

for i in range(5):      # 0, 1, 2, 3, 4
    print(f"第 {i} 次")

for i in range(1, 6):   # 1, 2, 3, 4, 5
    print(i)

for i in range(1, 10, 2):  # 1, 3, 5, 7, 9,步长2
    print(i)
阅读全文 »

Python if 判断:从”要不要做”到”做哪个”

写程序就是在做决策:用户年龄够不够?密码对不对?分数属于哪个等级?

Python 的 ifelifelse 就是用来做这些决策的。语法很简单,但真正写代码的时候,怎么把逻辑组织清楚、怎么避免常见问题,还是有些门道。

最简单的:if,一件事要不要做

阅读全文 »
0%