温故而知新day1[Python基础]

python

温故而知新--day1

变量类型

变量是计算机存储数据的内存空间,由于计算机可以处理不同的数据,不同的数据就要定义不同的数据类型。python的数据类型很多,还可以自定义数据类型,常用的一般数据类型有以下几种:

  1. 整型:

    • 在python2版本中有long和int之分,但到了python3中就只有int了。

    • 除此之外,整型还有进制的概念:二进制:0b10表示十进制2,八进制:0o10表示十进制8,十进制:10,十六进制:0x10表示十进制16

  2. 浮点型:

    • 即float,也就是小数,称之为浮点型是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的。

  3. 字符串

    • ""括起来的字符,比如:"hello, world"。

    • 在表示多行字符串时,可以使用三个单引号(""")/双引号(""")括起来

  4. 布尔型

    • 表示的是真或假,通常使用True或False表示。

    • 一些表达式的结果也可以表示真假,如:1 != 2

    • 空的数据类型(""、[]、{})和None0表示False,反之为True

  5. 复数

    • 如3+5j,跟数学上的复数表示一样,唯一不同的是虚部的i换成了j,了解即可。

函数

基本概念

计算机的函数实质上就是一段有特定功能的代码,使用函数可以有效的减少代码的耦合度,同时提高代码的可读性和易维护性。

函数的写法

计算机的函数和数学的函数有一定的相似性:

  1. 有参数,相当于数学函数的自变量

  2. 有返回值,相当于数学函数的因变量

python 的函数使用def关键词定义,需要写上函数名称,而参数值和返回值需要根据需求考虑是否填写。

如:

deffoo(num):

return num + 1

参数

前面说过,参数就相当于数学函数的自变量,主要是一些在函数体中用到的值,python的参数可以指定默认的参数。

defpow(num, count=2):

"""计算多少次方"""

return num ** count

if __name__ == "__main__":

print(pow(2)) # 4

print(pow(2, 3)) # 8

上面的函数的count参数即指定了默认参数count=2,对于某些对于参数不确定的函数还可以使用不定长参数,其方式一般为*args**kwargs,这两个参数接收的值的类型分别为listdict

deffoo(*args, **kwargs):

for a in args:

print(a)

for k, v in kwargs.items():

print(k, v)

if __name__ == "__main__":

foo(1, 2, 3, **{"a": 4, "b": 5, "c": 6}, d=7)

需要注意的是:在传入参数时,可以根据函数参数的位置传参,也可以根据根据参数的关键字传参。二者可以结合使用,但位置参数一定要在关键字参数之前。

比如对于def foo(a, b, c)来说,既可以foo(1, 2, 3)也可以foo(b=2, a=1, c=3)还可以foo(1, c=3, b=2)但不能foo(c=3, 1, 2)

返回值

使用返回值需要用到一个关键词return,一个函数的返回值可以是一个或多个值,也可以是一个函数。

导入模块

由于python没有函数重载的概念,所以假如定义了相同函数名的函数时,前一个函数会被后一个函数所覆盖:

deffoo():

print("foo1")

deffoo():

print("foo2")

在日常的开发过程中,假如是一个人开发的话可以为不同的函数取不同的名字,但假如是多人开发的话就有可能使用相同的函数名。多人开发时通常使用模块(module)开发,在使用时可以使用import关键字导入某个指定的模块。
m1.py:

deffoo():

print("foo1")

m2.py:

deffoo():

print("foo2")

在使用时:

import m1

import m2

# 使用

m1.foo()

m2.foo()

需要注意的是:导入模块时会将模块的内容执行一遍,假如不想这样的话,可以使用一个判断语句,使代码主动执行时运行,而不是导入时也运行。

deffoo():

print("foo")

if __name__ == "___main__":

foo()

__name__是Python中一个隐含的变量它代表了模块的名字,只有被Python解释器直接执行的模块的名字才是__main__。

作用域

作用域就相当于一个变量可以使用的范围,该作用域的变量只能本作用域和子作用域可用。有了作用域这个概念就有了全局变量和局部变量这两者变量,全局变量即声明在全局作用域中的变量,而局部变量则不是声明在全局的变量,一般来说是一些函数内部声明的变量。

n = 2# 全局变量

deffoo():

m = 3# 局部变量

根据python的规则,变量会优先找本作用域的,假如找不到会依次往外找,直至找到,当找不到时就会报错。

age = 19

defmain():

print(age)

main()

但假如要修改外部作用域的变量时,必须使用globalnonlocal这两个关键字声明一下,否则报错。因为python会认为修改的这个动作其实是声明,也就是说python没有朝外找变量,假如使用变量在声明变量之前的话,就会报错:UnboundLocalError: local variable "xxx" referenced before assignment

# 这是错误的示范

age = 18

defmain():

print(age)

age = 20

main()

print(age)

正确的方法:

  1. global

age = 18

defmain():

global age

print(age)

age = 20

main()

print(age)

如果我们希望函数内部的函数能够修改嵌套作用域中的变量,可以使用nonlocal关键字来指示变量来自于嵌套作用域。

2. nonlocal

deftest1():

count = 0

deftest2():

nonlocal count

count += 1

return count

return test2()

print(test1())

练习

  1. 实现计算求最大公约数和最小公倍数的函数。

    几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。例如:12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数。

  2. 实现判断一个数是不是素数的函数

# 第一题 求最大公约数和最小公倍数

defgcd(x, y):

"""最大公约数"""

(x, y) = (y, x) if x > y else (x, y)

for i in range(x, 0, -1):

if x % i == 0and y % i == 0:

return i

deflcm(x, y):

"""最小公倍数"""

return x * y // gcd(x, y)

# 第二题

defis_prime(num):

"""判断一个数是不是素数"""

for factor in range(2, int(num ** 0.5) + 1):

if num % factor == 0:

returnFalse

returnTrueif num != 1elseFalse

常用数据结构

字符串 str

字符串实质上就是由字符组成的有序序列。前面说过字符串是以引号括起来的,引号里面的内容可以使用进行转义,使一般的字符特殊化,如:"

"表示换行,""表示反斜杠,除此之外转义符还可以跟八进制(141)、十六进制(x61)和Unicode编码。

一些常用的转义符

字符

含义

在行尾时是续行符

反斜杠符号

"

单引号

"

双引号

a

响铃



退格

e

转义

00

 空 

换行

v 

 纵向制表符

横向制表符

回车

f

换页

除了转义以外,字符串还有很多使用方法。

  1. 切片

s = "hello, world"

print(s[1:4])

如上所述,切片实质上就是拿中括号写成[开头:结尾:步长]的形式(步长可以省略,且默认为一),把需要截取的一部分内容取出来,不过需要注意的是:切片里面的数不能超过要切片的范围,python的索引以0开始。假如要取开头([:n])或结尾([n:])的话,可以空着。

  1. 其他方法

    python的字符串还有很多的其他方法,这些方法本质上就是一些函数,使用时以"".xxx()的形式调用。

s = "hello world"

# 大写

print(s.upper()) # HELLO WORLD

# 首字母大写

print(s.title()) # Hello World

# 小写

print(s.lower()) # hello world

# 替换

print(s.replace("world", "world!")) # hello world!

# 分割

print(s.split(" ")) # ["hello", "world"]

# join

print(" ".join(["hello", "world"])) # hello world

# 两边去空

print(" hello world ".strip()) # hello world

# 查找

# 找的是第一个的位置,用rfind可以找最后一个

print(s.find("l")) # 2

# print(s.index("t")) # 找不着时会报错

# 判断开头、结尾

print(s.startswith("hello")) # True

print(s.endswith("ld")) # True

列表 list

列表也是python的一种常用的数据结构,上面例子中split方法的结果就是一个列表。列表由一个个元素组成,各个元素的类型可以各不相同,与字符一样,列表可以切片、也有一些特定的方法,不一样的是,列表可以直接通过索引对元素进行修改,而字符串则不可以。

温故而知新day1[Python基础] 的全部内容,
                        来源链接:
                            utcz.com/z/530250.html

回到顶部