Python基础04

本篇博客

1 函数

  1.1 局部变量和全局变量
  1.2 函数的缺省参数数(默认参数)
  1.3 函数文档及作用
  1.4 单一职责原则
  1.5 小结

2 容器

  2.1 字符串
    2.1.1 字符串特性
  2.2 字符串操作
    2.2.1 字符串遍历
    2.2.2 字符串替换
    2.2.3 字符串查找
    2.2.4 字符串切片
    2.2.5 字符串去除两侧空格、是否为字母
  2.3 小结

补充:

help() 也可以在代码中查看函数信息

字符:键盘上能敲的(#$,adb12)

字符串:字符的集合

字母:abfnd

1 函数

1.1 局部变量和全局变量

1. 全局变量: 在函数外部定义的变量.  全局变量可以被当前 python 文件内的所有函数直接使用.

    全局:就是当前python的文件。


2. 局部变量: 在函数内部定义的变量. 该变量只能在定义的函数内部使用.函数外部不能使用。

在函数内部也可以访问全局变量

g_val=100

def func1():

    print(g_val)

def func2():

    print(g_val)

func1()

func2()

 如果局部变量和全局变量命名冲突, Python 解释器会怎么做?

my_number=100

# 就近原则
# 变量先定义再使用
# 表示变量能够使用的范围
def func():

    my_number=200
    print(my_number)
    # my_number = 200  # 要放在这里会报错的 先定义再使用

func()
print(my_number)

就近原则:Python 解释器会在函数内部搜索变量 total_value, 如果找到了就直接使用, 如果找不到则到全局范围内搜索.

1.2 函数的缺省参数(默认参数)

默认参数:指的是当函数调用中省略了实参时默认使用的值,在形参中设置。

默认参数的语法与使用:

1. 在函数声明或定义时, 直接对参数赋值. 这就是设置形参的默认参数.
2. 在函数调用时, 省略部分或全部的参数. 这时可以用默认参数来代替

def my_function(a, b=20, c=30):
    return a+b+c

# ret = my_function(10)
# ret = my_function(10, 100)
ret = my_function(10, 100, 1000)

print(ret)

注意: 带有默认值的参数一定要位于形参参数列表的最后面.

(如果某一个位置形参设置了默认参数,那么该位置之后的所以参数都必须设置默认参数。)

1.3 函数文档及作用

函数也需要添加注释, 方便函数功能、参数以及返回值的含义能够被调用者知悉。DocString 是一个重要的工具, 由于它帮助你的程序文档更加简单易懂.

我们可以通过 ctrl + q 快捷键可以查看函数信息, 也可以通过 help() 函数来查看函数信息。

我们自己也可以给函数添加文档解释。加三引号注释。

# 单行函数文档字符串
def my_function(param):
 """函数做了什么事, 返回什么结果."""
 return param + 10

# 多行函数文档字符串 def my_add(num1, num2): """计算两个整数的和. :param int num1: 加法运算的左操作数 :param int num2: 加法运算的右操作数 :return 返回两个操作数相加的结果 """ result = num1 + num2 return result

1.4 单一职责原则

单一职责原则说的是一个函数只负责一个事情.这是因为, 如果一个函数承担的职责过多, 就等于把这些职责混合在 一起, 一个职责的变化可能会影响其它职责的能力

1.5 小结

1. 函数是实现代码复用的一种技术, 可以减少代码冗余.
2. 函数定义不会执行代码, 函数调用会执行代码.
3. 函数使用 def 来定义, 函数调用时候使用 "函数名(参数...)".
4. 函数调用时, 如果位置参数和关键字参数并存, 位置参数必须在关键字参数前面.
5. 函数的参数叫做形参, 调用函数时传递的数值叫做实参.
6. 函数内部定义的变量叫做局部变量, 函数外部定义的变量叫做全局变量. 6.1 局部变量只能在函数内部使用, 函
数外无法使用. 6.2 全局变量可以在当前 python 文件定义的所有函数中访问. 6.3 全局范围指的是整个 Python
文件范围.
7. 函数文档的作用解释说明函数, 并可以通过 ctrl + q 或者 help() 函数快速查阅.
8. 函数的编写要遵循的单一职责原则, 即一个函数只负责一个事情.
9. return 用于将函数的计算结果返回给函数的调用者, 使用时需要注意以下几点:

  •   9.1 只要函数执行碰到 return 就会停止执行.
  •   9.2 函数中可以编写多个 return, 但有且只有一个 return 会执行.
  •   9.3 return 后面可以跟上要返回的值, 也单独使用相当于 return None.
  •   9.4 break 用在循环中, 用来终止循环执行. return 用在函数中, 用来终止函数执行

2 容器

为什么要学习容器类型? 容器类型有什么用?

答: 之前学习的变量类型都只能存储单一元素, 如果我要存储全班100个学生的成绩, 需要定义100个变量. 将所有的 元素放在同一个容器中, 一个容器变量就可以存储多个元素. 减少了变量的定义

为什么容器类型提供了多个类型?

答: 每种容器针对了不同的使用场景, 有的容器方便操作、有的容器查询效率比较高、有的元素可以保证元素唯一、 有的元素可以保证数据只读等等. 学校就是一个容器, 学校有多种, 有学习动漫的、有学习IT编程的、有学习英语的 等等, 虽然都是学校但是所做的事情不同

容器分类?

1. 序列式容器中的元素在存放时都是连续存放的, 也就是序列式容器中, 除了第一个元素的前面没有元素, 最后一 个元素的后面没有元素, 其他所有的元素前后都有一个元素. 包括字符串、列表、元组.

2. 非序列式容器在存储元素时不是连续存放的, 容器中的任何一个元素前后都可能没有元素. 包括字典、集合.

序列式容器支持根据索引(下标)访问元素, 而非序列式容器不支持索引(下标)的方式访问元素.
序列式容器支持切片操作, 而非序列式容器不支持切片操作.

什么是索引?

在序列式容器中, 会给每一个元素赋予一个编号, 该编号从 0 开始计算. 第一个元素的索引就为 0, 第二个元素的索引 就为 1, 以此类推, 支持索引的容器可以使用 0 1 ... 来获得某个位置的元素

什么是切片?

通过索引可以获取序列式容器中的某个元素, 切片语法主要用于获得一个指定索引区间的多个元素, 例如获取从索引 值为 0 到索引值为 5 之间的所有元素

如何学习容器?

容器用来存储多个元素, 针对元素的操作提供了一些操作方法, 比如添加一个元素、删除一个元素、修改一个元素、 对容器中的元素排序等等

学习容器类型就是在学习容器的特点、以及容器对元素的操作

上面所说的 "方法", 就是我们所说所学的函数, 本质上 "方法"和"函数"指的是同一个东西, 只不过我们将某个类型专 属的一些函数叫做方法.

2.1 字符串

如何定义字符串?

1. 字符串使用一对单引号来定义.
2. 字符串使用一对双引号来定义.
3. 字符串使用一对三引号来定义

my_str = 'hello'
my_str = "hello"
my_str = """
我是中国人
我爱中国
我喜欢吃火锅
"""

print(my_str)

一般我们在定义字符串时候, 使用两个单引号或者两个双引号, 很少使用三引号

2.1.1 字符串特性

字符串一旦定义就不能在原字符串中修改。

my_str = 'abcd1234'
my_str[0] = 'Q'
print(my_str)  #TypeError: 'str' object does not support item assignment

# 字符串一旦定义不允许修改
# 字符串容器中的元素都是字符类型

注意:所以后面的字符串操作后,就要用变量接受新字符串。

2.2 字符串操作

2.2.1 字符串遍历

遍历:  不重复的访问容器中的每个元素

我们可以使用 while 循环来访问字符串容器中的每一个字符元素

my_str = "hello"

i=0
while i <=4:
    print(my_str[i],end=' ')
    i += 1

注意: 序列式容器的索引都是以 0 开始的, 并不是从 1 开始

对于容器的遍历, 提供了另外一种简单方式, for 循环.

my_str = "hello"

for i in my_str:
    print(i,end=' ')

2.2.2 字符串替换  replace方法

1. 查找到错别字茹.

2. 将错别字替换成正确的如字.

3.我们可以指定第三个参数, 替换多少次.

poetry = '远看泰山黑乎乎, 上头细来下头粗. 茹把泰山倒过来, 下头茹来上头粗.'
# 将所有的 '' 替换为 ''
right_poetry = poetry.replace('', '')
print(poetry)
print(right_poetry)
# 只替换第一次出现的 ''
right_poetry = poetry.replace('', '', 1)
print(right_poetry)

容器专属函数(这里叫方法)
字符串通过点的方式调用专属的函数

2.2.3 字符串查找  find方法

find 语法

str.find(str, beg=0, end=len(string))
  • str -- 指定检索的字符串
  • beg -- 开始索引,默认为0。
  • end -- 结束索引,默认为字符串的长度。

如果包含子字符串返回第一次元素的索引值,否则返回-1。

2.2.4 字符串切片

切片:字符串属于序列式容器, 可以根据索引获得某一个字符, 也可以根据由两个索引标识的区间获得区间内的字符序列.

切片语法: 左闭后开

user_email = 'simagousheng@itcast.cn'
print(user_email)
print(user_email[0])
# 切片语法 左闭后开
print(user_email[0:4])  # 0,1,2,3
print(user_email[0:12])
# 获得容器的元素的个数
string_len = len(user_email)
print(user_email[13:string_len])

省略写法

user_email = 'simagousheng@itcast.cn'

# 起始值不写表示从0开始
print(user_email[:12])
# 结束值不写表示到最后
print(user_email[13:])
# 都不写表示从开始到结束
print(user_email[:])

步长

user_email = 'simagousheng@itcast.cn'
# 步长
print(user_email[0:12])
print(user_email[0:12:3])

了解 起始 结束 步长都可以为负数

user_email = 'simagousheng@itcast.cn'
# 了解 起始 结束 步长都可以为负数
print(user_email[-5:-1])
print(user_email[6:1:-1])

注意:步长为正数(或省略),起始值要小于结束值;步长为负数,起始值要大于结束值

逆序

user_email = 'simagousheng@itcast.cn'

# 字符串逆序
print(user_email[::-1])

切片和查找小案例:邮箱

# user_email = 'simagousheng@itcast.cn'
# 1. 找到字符串中的@位置
# 2. 获得字符串中的子串

user_email = 'simagousheng@itcast.cn'
print(user_email)
position = user_email.find('@')
if position == -1:
    print('邮箱不合法')
else:
    user_name = user_email[:position]
    user_houzui = user_email[position+1:]
    print('用户名',user_name)
    print('后缀',user_houzui)

    print('@的位置是',position)

2.2.5 字符串分割  split (也叫‘拆分’)

字符串的 split 方法根据指定的分割字符串, 将原字符串分割成多个部分, 以列表形式返回

my_str = 'as#dsf#sf123#sff'
ret=my_str.split('#')
print(ret)
print(ret[0])
print(ret[3])

字符串的 count 方法返回指定子串出现的次数.

user_email = 'simagousheng@itc@ast.cn'
# 判断 user_email 是否有多个 @
at_count = user_email.count('@')
print(at_count)

小案例:邮箱另一种思路

user_email = 'simagousheng@itcast.cn'
# 判断 user_email 是否有多个 @
at_count = user_email.count('@')
if at_count > 1:
    print('邮箱地址不合法, 出现了多个@符号!')
else:
    # 根据 @ 将字符串截取为多个部分
    result = user_email.split('@')
    # 输出用户名和邮箱后缀
    print('用户名', result[0])
    print('后缀', result[1])

2.2.6 字符串去除两侧空格、是否为字母

字符串去除两侧空格     strip

 # 获得用户注册用户名
register_username = input('请输入您的用户名:')
# 去除用户名两侧的空格
register_username = register_username.strip()
print(register_username)

lstrip :去除左边的空格     rstrip:去除右边的空格

判断是否为字母  isalpha

# 获得用户注册用户名
register_username = input('请输入您的用户名:')
# 判断是否为字母
ret = register_username.isalpha()
print(ret)

小案例:我们经常在各个网站进行会员注册, 一般注册的处理流程如下:
1. 获得用户输入的注册用户名.
2. 用户在输入用户名时, 可能在用户名两个不小心输入多个空格. 我们需要去除用户名两侧的空格.
3. 判断用户名是否全部为字母(用户名的组成由我们来规定, 这里我们规定必须是字母)
4. 处理完毕之后, 显示注册成功

# 获得用户注册用户名
register_username = input('请输入您的用户名:')
# 去除用户名两侧的空格
register_username = register_username.strip()
print(register_username)
# 判断字符串是否全部为字母
if register_username.isalpha():
 print('恭喜您:', register_username, '注册成功!')
else:
 print('注册失败!')

 ret = register_username.isdigit() # 判断是不是数字
 print(ret)

判断是不是数字    isdigit

 # 获得用户注册用户名
register_username = input('请输入您的用户名:')

ret = register_username.isdigit() # 判断是不是数字
print(ret)

2.3 小结

1. 字符串一般使用两个双引号或两个单引号来定义.
2. 字符串容器特点: 元素不能修改, 并且只能由一系列字符组成.
3. 字符串是序列式容器, 支持下标索引和切片操作, 索引支持正数和负数.
4. 切片语法由开始索引、结束索引、步长组成, 语法格式如: my_str[start: end: step]

  •   4.1 开始索引省略默认为0.
  •   4.2 结束索引省略默认为最后一个元素的索引的下一个索引.
  •   4.3 步长省略默认为 1.
  •   4.4 步长为负数时, 开始索引就变成结束索引, 结束索引就变成开始索引.
  •   4.5 切片的索引区间为左闭右开.

5. 字符串遍历可以使用 while 循环, 也可以使用 for 循环.
6. 字符串的 find 方法用于查找指定子串是否存在, 存在则返回出现的索引位置, 否则返回-1.
7. 字符串的 repalce 方法用于替换字符串中的指定子串, 注意, 不会修改原字符串. 会返回一个替换后的新字符串.
8. 字符串的 count 方法返回指定子串出现的次数.
9. 字符串的 split 方法根据指定的分割字符串, 将原字符串分割成多个部分, 以列表形式返回.
10. 字符串的 strip 方法去除字符串两侧空格.
11. 字符串的 isalpha 方法判断字符串是否全部为字母组成.

原文地址:https://www.cnblogs.com/zhangyangcheng/p/12420724.html