Added Lecture 4

This commit is contained in:
DerGrumpf 2024-11-15 14:07:18 +01:00
parent 796653da22
commit 2776e66c5b
9 changed files with 5764 additions and 40 deletions

View File

@ -0,0 +1,701 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => DynamicBackgroundPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
// effects/dark-dynamic-star-sky.ts
function Add_StarSky(dynamicBackgroundContainer) {
if (dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-star-sky-dynamic-effect" });
effect.createEl("div", { cls: "star-sky" });
}
}
function Remove_StarSky(dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.find("div.odb-dt-star-sky-dynamic-effect");
if (effect) {
effect.remove();
}
}
// effects/dark-dynamic-snow.ts
var DarkTheme_Snow_Background_Property = "radial-gradient(ellipse at bottom, #1b2735 20%, #090a0f 100%)";
function Add_Snow(dynamicBackgroundContainer) {
if (dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-snow-dynamic-effect" });
effect.createEl("div", { cls: "snow" });
}
}
function Remove_Snow(dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.find("div.odb-dt-snow-dynamic-effect");
if (effect) {
effect.remove();
}
}
// effects/dark-dynamic-rain.ts
var DarkTheme_Rain_Background_Property = "radial-gradient(ellipse at bottom, #1b2735 20%, #090a0f 100%)";
function Add_Rain(dynamicBackgroundContainer) {
if (dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-rain-dynamic-effect" });
let drop1 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 34; --y: 90; --o: 0.6654153804683264; --a: 0.9917710156945896; --d: -0.8043425740744814; --s: 0.6951142349804096"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop2 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 49; --y: 81; --o: 0.0317509941505465; --a: 1.4150340796041947; --d: -0.8977060475990615; --s: 0.3560926038758976"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop3 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 93; --y: 6; --o: 0.6536147164205229; --a: 1.3150980722082548; --d: -0.5493637177821533; --s: 0.5552132370247103"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop4 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 22; --y: 13; --o: 0.4259600004078947; --a: 0.5854285185377734; --d: -0.5293135001180258; --s: 0.3526760878325925"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop5 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 36; --y: 20; --o: 0.5609448459063665; --a: 1.4252956133711117; --d: -0.7690131594986251; --s: 0.6689223471599941"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop6 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 48; --y: 54; --o: 0.2850601343180057; --a: 1.4235635026018683; --d: -0.4523568427598179; --s: 0.19763333766570312"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop7 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 16; --y: 4; --o: 0.4224367492164993; --a: 0.9291570251573422; --d: -0.7072288650072931; --s: 0.3225005986968783"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop8 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 50; --y: 52; --o: 0.5163724944648716; --a: 0.5163417250721392; --d: -0.24562675844904858; --s: 0.7462277243198527"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop9 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 35; --y: 66; --o: 0.31206402174244974; --a: 0.6059744356541634; --d: 0.37906548779328597; --s: 0.7307418662633716"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop10 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 64; --y: 81; --o: 0.8158102807508611; --a: 0.6722718682672502; --d: 0.2444215747954348; --s: 0.8667250195046547"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop11 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 88; --y: 35; --o: 0.02762815253441553; --a: 0.9555468749843488; --d: 0.08996319031500377; --s: 0.7428281610861129"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop12 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 88; --y: 91; --o: 0.6103134847919844; --a: 0.9001734345539698; --d: -0.917351021576823; --s: 0.0040542399155854"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop13 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 62; --y: 54; --o: 0.2856796208317729; --a: 0.9046554131241138; --d: -0.13645809866400516; --s: 0.5739079247947556"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop14 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 26; --y: 67; --o: 0.3249777593937293; --a: 1.0274350664090073; --d: -0.8605688159121647; --s: 0.7199893214500341"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop15 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 74; --y: 39; --o: 0.6085176773865959; --a: 1.1647324962389058; --d: -0.08643048534587949; --s: 0.5449421802860281"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drop16 = '<svg class="rain__drop" preserveAspectRatio="xMinYMin" viewBox="0 0 5 50" style="--x: 3; --y: 78; --o: 0.7413154227917105; --a: 0.7082137175865917; --d: 0.931629538260506; --s: 0.48335465500642294"><path stroke="none" d="M 2.5,0 C 2.6949458,3.5392017 3.344765,20.524571 4.4494577,30.9559 5.7551357,42.666753 4.5915685,50 2.5,50 0.40843152,50 -0.75513565,42.666753 0.55054234,30.9559 1.655235,20.524571 2.3050542,3.5392017 2.5,0 Z"></path></svg>';
let drops = drop1 + drop2 + drop3 + drop4 + drop5 + drop6 + drop7 + drop8 + drop9 + drop10;
drops += drop11 + drop12 + drop13 + drop14 + drop15 + drop16;
effect.innerHTML += drops;
}
}
function Remove_Rain(dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.find("div.odb-dt-rain-dynamic-effect");
if (effect) {
effect.remove();
}
}
// effects/dark-dynamic-random-circle.ts
var DarkTheme_Random_Circle_Background_Property = "radial-gradient(ellipse at bottom, #1b2735 20%, #090a0f 100%)";
function Add_RandomCircle(dynamicBackgroundContainer) {
let effectScript;
if (dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-random-circle-dynamic-effect" });
effect.createEl("canvas");
let code = `
var odb_random_circle_ctx;
var odb_random_circle_grd;
function Obsidian_Dynamic_Background_Start() {
var canvas = document.querySelector("div.odb-dt-random-circle-dynamic-effect canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
odb_random_circle_ctx = canvas.getContext("2d");
odb_random_circle_grd = odb_random_circle_ctx.createLinearGradient(0, window.innerHeight, 0, 0);
odb_random_circle_ctx.fillStyle = odb_random_circle_grd;
odb_random_circle_ctx.fillRect(0, 0, window.innerWidth, window.innerHeight);
Obsidian_Dynamic_Background_Animate();
}
function Obsidian_Dynamic_Background_Firework(x, y) {
this.x = x;
this.y = y;
this.radius = 5;
this.time = 0;
this.lifespan = Math.random()*180 + 150;
this.draw = function() {
odb_random_circle_ctx.beginPath();
odb_random_circle_ctx.arc(this.x, window.innerHeight - this.y, this.radius, 0, 2*Math.PI, false);
var alpha = (this.lifespan - this.time)/this.lifespan;
odb_random_circle_ctx.strokeStyle = "rgba(255, 255, 255, " + alpha + ")";
odb_random_circle_ctx.stroke();
}
this.update = function() {
if (this.time < this.lifespan) {
this.radius += .25;
this.time += 1;
this.draw();
}
}
}
var fireworks = [];
var time = 0;
function Obsidian_Dynamic_Background_Animate() {
odb_random_circle_ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);
odb_random_circle_ctx.fillStyle = odb_random_circle_grd;
odb_random_circle_ctx.fillRect(0, 0, window.innerWidth, window.innerHeight);
if (time % Math.floor(Math.random()*100 + 40) == 0) {
var x = Math.floor(Math.random()*window.innerWidth);
var y = Math.floor(Math.random()*window.innerHeight);
fireworks.push(new Obsidian_Dynamic_Background_Firework(x, y));
}
fireworks.forEach(firework => {
firework.update();
if ((firework.time - firework.explosionTime) > 20) {
for (var i = 0; i < fireworks.length; i++) {
if (firework === fireworks[i]) {
delete fireworks[i];
}
}
}
})
time += 1;
if (Obsidian_Dynamic_Background_Animate)
requestAnimationFrame(Obsidian_Dynamic_Background_Animate);
}
Obsidian_Dynamic_Background_Start();
`;
effectScript = effect.createEl("script");
effectScript.textContent = code;
}
}
function Remove_RandomCircle(dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.find("div.odb-dt-random-circle-dynamic-effect");
if (effect) {
effect.remove();
}
Unload_Effect_Script();
}
function Unload_Effect_Script() {
window["Obsidian_Dynamic_Background_Start"] = null;
window["Obsidian_Dynamic_Background_Firework"] = null;
window["Obsidian_Dynamic_Background_Animate"] = null;
}
// effects/light-dynamic-random-circle.ts
var LightTheme_Random_Circle_Background_Property = "linear-gradient(0deg, rgba(255,255,255,1) 62%, rgba(230,244,255,1) 100%)";
function Add_RandomCircle_Light(dynamicBackgroundContainer) {
let effectScript;
if (dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-lt-random-circle-dynamic-effect" });
effect.createEl("canvas");
let code = `
var odb_random_circle_ctx;
var odb_random_circle_grd;
function Obsidian_Dynamic_Background_Start() {
var canvas = document.querySelector("div.odb-lt-random-circle-dynamic-effect canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
odb_random_circle_ctx = canvas.getContext("2d");
odb_random_circle_grd = odb_random_circle_ctx.createLinearGradient(0, window.innerHeight, 0, 0);
odb_random_circle_ctx.fillStyle = odb_random_circle_grd;
odb_random_circle_ctx.fillRect(0, 0, window.innerWidth, window.innerHeight);
Obsidian_Dynamic_Background_Animate();
}
function Obsidian_Dynamic_Background_Firework(x, y) {
this.x = x;
this.y = y;
this.radius = 5;
this.time = 0;
this.lifespan = Math.random()*180 + 150;
this.draw = function() {
odb_random_circle_ctx.beginPath();
odb_random_circle_ctx.arc(this.x, window.innerHeight - this.y, this.radius, 0, 2*Math.PI, false);
var alpha = (this.lifespan - this.time)/this.lifespan;
odb_random_circle_ctx.strokeStyle = "rgba(0, 128, 255, " + alpha + ")";
odb_random_circle_ctx.stroke();
}
this.update = function() {
if (this.time < this.lifespan) {
this.radius += .25;
this.time += 1;
this.draw();
}
}
}
var fireworks = [];
var time = 0;
function Obsidian_Dynamic_Background_Animate() {
odb_random_circle_ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);
odb_random_circle_ctx.fillStyle = odb_random_circle_grd;
odb_random_circle_ctx.fillRect(0, 0, window.innerWidth, window.innerHeight);
if (time % Math.floor(Math.random()*100 + 40) == 0) {
var x = Math.floor(Math.random()*window.innerWidth);
var y = Math.floor(Math.random()*window.innerHeight);
fireworks.push(new Obsidian_Dynamic_Background_Firework(x, y));
}
fireworks.forEach(firework => {
firework.update();
if ((firework.time - firework.explosionTime) > 20) {
for (var i = 0; i < fireworks.length; i++) {
if (firework === fireworks[i]) {
delete fireworks[i];
}
}
}
})
time += 1;
if (Obsidian_Dynamic_Background_Animate)
requestAnimationFrame(Obsidian_Dynamic_Background_Animate);
}
Obsidian_Dynamic_Background_Start();
`;
effectScript = effect.createEl("script");
effectScript.textContent = code;
}
}
function Remove_RandomCircle_Light(dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.find("div.odb-lt-random-circle-dynamic-effect");
if (effect) {
effect.remove();
}
Unload_Effect_Script2();
}
function Unload_Effect_Script2() {
window["Obsidian_Dynamic_Background_Start"] = null;
window["Obsidian_Dynamic_Background_Firework"] = null;
window["Obsidian_Dynamic_Background_Animate"] = null;
}
// effects/light-dynamic-wave.ts
var LightTheme_Wave_Background_Property = "linear-gradient(0deg, rgba(255,255,255,1) 60%, rgba(201,233,255,1) 100%)";
function Add_Wave_Light(dynamicBackgroundContainer) {
let effectScript;
if (dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-lt-wave-effect" });
effect.createEl("div", { cls: "ocean" });
let code = `
function Obsidian_Dynamic_Background_ShowWave() {
var ocean = document.querySelector("div.odb-lt-wave-effect div.ocean"),
waveWidth = 10,
waveCount = Math.floor(window.innerWidth/waveWidth),
docFrag = document.createDocumentFragment();
for(var i = 0; i < waveCount; i++){
var wave = document.createElement("div");
wave.className += " wave-0723";
docFrag.appendChild(wave);
wave.style.left = i * waveWidth + "px";
wave.style.webkitAnimationDelay = (i/100) + "s";
}
ocean.appendChild(docFrag);
}
Obsidian_Dynamic_Background_ShowWave();
`;
effectScript = effect.createEl("script");
effectScript.textContent = code;
}
}
function Remove_Wave_Light(dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.find("div.odb-lt-wave-effect");
if (effect) {
effect.remove();
}
Unload_Effect_Script3();
}
function Unload_Effect_Script3() {
window["Obsidian_Dynamic_Background_ShowWave"] = null;
}
// effects/dark-dynamic-digital-rain.ts
var DarkTheme_Digital_Rain_Background_Property = "radial-gradient(ellipse at bottom, #1b2735 20%, #090a0f 100%)";
function Add_DigitalRain(dynamicBackgroundContainer) {
let effectScript;
if (dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.createEl("div", { cls: "odb-dt-digital-rain-dynamic-effect" });
effect.createEl("canvas");
let code = `
var odb_digital_rain_canvas
var odb_digital_rain_ctx;
var odb_digital_rain_grd;
var odb_digital_rain_digitals = "1001101010110101010101010010101010101011101111010101010110101010101010101110010101";
var odb_digital_rain_font_size = 15;
var odb_digital_rain_columns; //number of columns for the rain
var odb_digital_rain_drops = []; //an array of drops - one per column
var odb_digital_rain_interval;
function Obsidian_Dynamic_Background_Draw(){
odb_digital_rain_ctx.fillStyle = "rgba(0, 0, 0, 0.1)";
odb_digital_rain_ctx.fillRect(0, 0, odb_digital_rain_canvas.width, odb_digital_rain_canvas.height);
odb_digital_rain_ctx.fillStyle = "#0F0";
odb_digital_rain_ctx.font = odb_digital_rain_font_size + "px arial";
for(var i = 0; i < odb_digital_rain_drops.length; i++)
{
var digital = odb_digital_rain_digitals[Math.floor(Math.random()*odb_digital_rain_digitals.length)];
odb_digital_rain_ctx.fillText(digital, i*odb_digital_rain_font_size, odb_digital_rain_drops[i]*odb_digital_rain_font_size);
if(odb_digital_rain_drops[i]*odb_digital_rain_font_size > odb_digital_rain_canvas.height && Math.random() > 0.975)
odb_digital_rain_drops[i] = 0;
odb_digital_rain_drops[i]++;
}
}
function Obsidian_Dynamic_Background_Start() {
odb_digital_rain_canvas = document.querySelector("div.odb-dt-digital-rain-dynamic-effect canvas");
odb_digital_rain_canvas.width = window.innerWidth;
odb_digital_rain_canvas.height = window.innerHeight;
odb_digital_rain_ctx = odb_digital_rain_canvas.getContext("2d");
odb_digital_rain_ctx.globalAlpha = 1;
odb_digital_rain_ctx.globalCompositeOperation = "xor";
odb_digital_rain_columns = odb_digital_rain_canvas.width/odb_digital_rain_font_size;
for(var x = 0; x < odb_digital_rain_columns; x++)
odb_digital_rain_drops[x] = 1;
}
function Obsidian_Dynamic_Background_SetBrightness(brightness) {
odb_digital_rain_canvas.width = window.innerWidth; // clear canvas
odb_digital_rain_ctx.globalCompositeOperation = "xor";
odb_digital_rain_ctx.globalAlpha = brightness;
}
function Obsidian_Dynamic_Background_Clear() {
clearInterval(odb_digital_rain_interval);
}
Obsidian_Dynamic_Background_Start();
odb_digital_rain_interval = setInterval(Obsidian_Dynamic_Background_Draw, 80);
`;
effectScript = effect.createEl("script");
effectScript.textContent = code;
}
}
function Remove_DigitalRain(dynamicBackgroundContainer) {
let effect = dynamicBackgroundContainer.find("div.odb-dt-digital-rain-dynamic-effect");
if (effect) {
CallClear(dynamicBackgroundContainer);
effect.remove();
}
Unload_Effect_Script4();
}
function Unload_Effect_Script4() {
window["Obsidian_Dynamic_Background_Start"] = null;
window["Obsidian_Dynamic_Background_Draw"] = null;
window["Obsidian_Dynamic_Background_Clear"] = null;
window["Obsidian_Dynamic_Background_SetBrightness"] = null;
}
function CallClear(dynamicBackgroundContainer) {
let effectScript;
let effect = dynamicBackgroundContainer.find("div.odb-dt-digital-rain-dynamic-effect");
let code = `
Obsidian_Dynamic_Background_Clear();
`;
effectScript = effect.createEl("script");
effectScript.textContent = code;
}
function SetBrightness(dynamicBackgroundContainer, brightness) {
let setBrightnessScript;
let setBrightnessScriptContainer;
let effect = dynamicBackgroundContainer.find("div.odb-dt-digital-rain-dynamic-effect");
if (effect) {
let setBrightnessScriptContainer2 = dynamicBackgroundContainer.find("div.odb-dt-digital-rain-dynamic-effect div.set-brightness-script-container");
if (setBrightnessScriptContainer2) {
setBrightnessScriptContainer2.remove();
}
setBrightnessScriptContainer2 = effect.createEl("div", { cls: "div.set-brightness-script-container" });
let code = "Obsidian_Dynamic_Background_SetBrightness(" + brightness + ")";
setBrightnessScript = setBrightnessScriptContainer2.createEl("script");
setBrightnessScript.textContent = code;
}
}
// main.ts
var DEFAULT_SETTINGS = {
dynamicEffect: 1 /* Dark_StarSky */,
digitalRainBrightness: 0.7,
enableDynamicEffect: true,
backgroundImageFile: "",
blur: 0
};
var DynamicBackgroundPlugin = class extends import_obsidian.Plugin {
onload() {
return __async(this, null, function* () {
console.log("loading dynamic background plugin...");
this.preDynamicEffect = -1 /* Unknown */;
yield this.loadSettings();
this.addSettingTab(new DynamicBackgroundSettingTab(this.app, this));
this.app.workspace.onLayoutReady(() => {
this.AddDynamicBackgroundContainer();
this.SetDynamicBackgroundContainerBgProperty();
if (this.settings.enableDynamicEffect == true) {
this.AddDynamicBackgroundEffect(this.settings.dynamicEffect);
}
});
});
}
onunload() {
console.log("unloading dynamic background plugin...");
this.RemoveDynamicBackgroundContainer();
}
loadSettings() {
return __async(this, null, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.settings);
});
}
AddDynamicBackgroundContainer() {
let div_root = app.workspace.containerEl.find("div.workspace > div.mod-root");
this.dynamicBackgroundContainer = null;
if (div_root) {
this.dynamicBackgroundContainer = div_root.createEl("div", { cls: "rh-obsidian-dynamic-background-container" });
this.wallpaperCover = this.dynamicBackgroundContainer.createEl("div", { cls: "rh-wallpaper-cover" });
this.SetWallpaperBlur();
}
}
SetWallpaperBlur() {
let value = "blur(" + this.settings.blur.toString() + "px)";
this.wallpaperCover.style.setProperty("filter", value);
}
RemoveDynamicBackgroundContainer() {
if (this.dynamicBackgroundContainer) {
this.dynamicBackgroundContainer.remove();
this.dynamicBackgroundContainer = null;
}
}
SetDynamicBackgroundContainerBgProperty() {
return __async(this, null, function* () {
if (this.dynamicBackgroundContainer == null)
return;
let backgroundImageAlreadySet = false;
let imageFullFilename = "";
try {
imageFullFilename = this.app.vault.adapter.getResourcePath(this.settings.backgroundImageFile);
} catch (e) {
}
if (imageFullFilename != "") {
this.dynamicBackgroundContainer.style.setProperty("background", 'url("' + imageFullFilename + '"');
this.dynamicBackgroundContainer.style.setProperty("background-size", "cover");
this.dynamicBackgroundContainer.style.setProperty("background-position", "center");
backgroundImageAlreadySet = true;
} else {
this.dynamicBackgroundContainer.style.removeProperty("background");
this.dynamicBackgroundContainer.style.removeProperty("background-size");
this.dynamicBackgroundContainer.style.removeProperty("background-position");
}
if (backgroundImageAlreadySet == false) {
this.dynamicBackgroundContainer.style.removeProperty("background");
this.dynamicBackgroundContainer.style.removeProperty("background-size");
this.dynamicBackgroundContainer.style.removeProperty("background-position");
if (this.settings.enableDynamicEffect == false)
return;
switch (this.settings.dynamicEffect) {
case 1 /* Dark_StarSky */:
break;
case 2 /* Dark_Snow */:
this.dynamicBackgroundContainer.style.setProperty("background", DarkTheme_Snow_Background_Property);
break;
case 3 /* Dark_Rain */:
this.dynamicBackgroundContainer.style.setProperty("background", DarkTheme_Rain_Background_Property);
break;
case 4 /* Dark_RandomCircle */:
this.dynamicBackgroundContainer.style.setProperty("background", DarkTheme_Random_Circle_Background_Property);
break;
case 40 /* Light_RandomCircle */:
this.dynamicBackgroundContainer.style.setProperty("background", LightTheme_Random_Circle_Background_Property);
break;
case 41 /* Light_Wave */:
this.dynamicBackgroundContainer.style.setProperty("background", LightTheme_Wave_Background_Property);
break;
case 5 /* Dark_DigitalRain */:
this.dynamicBackgroundContainer.style.setProperty("background", DarkTheme_Digital_Rain_Background_Property);
}
}
});
}
SetDigitalRainBrightnessHelper() {
if (this.dynamicBackgroundContainer) {
SetBrightness(this.dynamicBackgroundContainer, this.settings.digitalRainBrightness);
}
}
AddDynamicBackgroundEffect(effect) {
switch (effect) {
case 1 /* Dark_StarSky */:
if (this.dynamicBackgroundContainer)
Add_StarSky(this.dynamicBackgroundContainer);
break;
case 2 /* Dark_Snow */:
if (this.dynamicBackgroundContainer)
Add_Snow(this.dynamicBackgroundContainer);
break;
case 3 /* Dark_Rain */:
if (this.dynamicBackgroundContainer)
Add_Rain(this.dynamicBackgroundContainer);
break;
case 5 /* Dark_DigitalRain */:
if (this.dynamicBackgroundContainer) {
Add_DigitalRain(this.dynamicBackgroundContainer);
this.SetDigitalRainBrightnessHelper();
}
break;
case 4 /* Dark_RandomCircle */:
if (this.dynamicBackgroundContainer)
Add_RandomCircle(this.dynamicBackgroundContainer);
break;
case 40 /* Light_RandomCircle */:
if (this.dynamicBackgroundContainer)
Add_RandomCircle_Light(this.dynamicBackgroundContainer);
break;
case 41 /* Light_Wave */:
if (this.dynamicBackgroundContainer)
Add_Wave_Light(this.dynamicBackgroundContainer);
break;
}
}
RemoveDynamicBackgroundEffect(effect) {
if (effect == -1 /* Unknown */)
return;
switch (effect) {
case 1 /* Dark_StarSky */:
if (this.dynamicBackgroundContainer)
Remove_StarSky(this.dynamicBackgroundContainer);
break;
case 2 /* Dark_Snow */:
if (this.dynamicBackgroundContainer)
Remove_Snow(this.dynamicBackgroundContainer);
break;
case 3 /* Dark_Rain */:
if (this.dynamicBackgroundContainer)
Remove_Rain(this.dynamicBackgroundContainer);
break;
case 5 /* Dark_DigitalRain */:
if (this.dynamicBackgroundContainer)
Remove_DigitalRain(this.dynamicBackgroundContainer);
break;
case 4 /* Dark_RandomCircle */:
if (this.dynamicBackgroundContainer)
Remove_RandomCircle(this.dynamicBackgroundContainer);
break;
case 40 /* Light_RandomCircle */:
if (this.dynamicBackgroundContainer)
Remove_RandomCircle_Light(this.dynamicBackgroundContainer);
break;
case 41 /* Light_Wave */:
if (this.dynamicBackgroundContainer)
Remove_Wave_Light(this.dynamicBackgroundContainer);
break;
}
}
};
var DynamicBackgroundSettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app2, plugin) {
super(app2, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "Dynamic Background Plugin - Settings" });
new import_obsidian.Setting(containerEl).setName("Dynamic Effect").setDesc("Select a dynamic effect").addDropdown((dropdown) => dropdown.addOption(5 /* Dark_DigitalRain */.toString(), "Dark - Matrix / Digital Rain").addOption(3 /* Dark_Rain */.toString(), "Dark - Rain").addOption(4 /* Dark_RandomCircle */.toString(), "Dark - Random Circle").addOption(2 /* Dark_Snow */.toString(), "Dark - Snow").addOption(1 /* Dark_StarSky */.toString(), "Dark - Star Sky").addOption(40 /* Light_RandomCircle */.toString(), "Light - Random Circle").addOption(41 /* Light_Wave */.toString(), "Light - Wave").setValue(this.plugin.settings.dynamicEffect.toString()).onChange((value) => __async(this, null, function* () {
this.plugin.preDynamicEffect = this.plugin.settings.dynamicEffect;
this.plugin.settings.dynamicEffect = Number(value);
yield this.plugin.saveSettings();
this.plugin.RemoveDynamicBackgroundEffect(this.plugin.preDynamicEffect);
if (this.plugin.settings.enableDynamicEffect == true)
this.plugin.AddDynamicBackgroundEffect(this.plugin.settings.dynamicEffect);
this.plugin.SetDynamicBackgroundContainerBgProperty();
this.display();
})));
if (this.plugin.settings.dynamicEffect == 5 /* Dark_DigitalRain */) {
new import_obsidian.Setting(containerEl).setName("Brightness").setDesc("Set Digital Rain Brightness.").addSlider((tc) => {
tc.setDynamicTooltip().setLimits(0.5, 1, 0.01).setValue(this.plugin.settings.digitalRainBrightness).onChange((value) => __async(this, null, function* () {
this.plugin.settings.digitalRainBrightness = value;
this.plugin.SetDigitalRainBrightnessHelper();
yield this.plugin.saveSettings();
}));
});
}
new import_obsidian.Setting(containerEl).setName("Enable Dynamic Effect").setDesc("Enable or disable dynamic effect").addToggle((tc) => tc.setValue(this.plugin.settings.enableDynamicEffect).onChange((value) => __async(this, null, function* () {
this.plugin.settings.enableDynamicEffect = value;
yield this.plugin.saveSettings();
if (this.plugin.settings.enableDynamicEffect == false) {
this.plugin.RemoveDynamicBackgroundEffect(this.plugin.settings.dynamicEffect);
} else {
this.plugin.AddDynamicBackgroundEffect(this.plugin.settings.dynamicEffect);
}
})));
new import_obsidian.Setting(containerEl).setName("Static Wallpaper Image").setDesc("Image file in Vault. Please use the relative path of the image file inside Vault.").addTextArea((text) => text.setValue(this.plugin.settings.backgroundImageFile).setPlaceholder("Example: attachments/moon.jpg or wallpapers/green.png").then((cb) => {
cb.inputEl.style.width = "100%";
cb.inputEl.rows = 5;
}).onChange((value) => __async(this, null, function* () {
this.plugin.settings.backgroundImageFile = value;
yield this.plugin.saveSettings();
this.plugin.SetDynamicBackgroundContainerBgProperty();
})));
new import_obsidian.Setting(containerEl).setName("Blur").setDesc("The blurriness of the wallpaper, 0 means no blur.").addSlider((tc) => {
tc.setDynamicTooltip().setLimits(0, 100, 1).setValue(this.plugin.settings.blur).onChange((value) => __async(this, null, function* () {
this.plugin.settings.blur = value;
yield this.plugin.saveSettings();
this.plugin.SetWallpaperBlur();
}));
});
}
};
/* nosourcemap */

View File

@ -0,0 +1,10 @@
{
"id": "obsidian-dynamic-background",
"name": "Dynamic Background",
"version": "1.0.6",
"minAppVersion": "0.12.0",
"description": "Adding dynamic effects and/or static wallpapers for Obsidian background",
"author": "Samuel Song",
"authorUrl": "https://www.readinghere.com",
"isDesktopOnly": false
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,532 @@
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"id": "1486c477-e52f-492a-a699-4f6668f43826",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"<div style=\"display:flex;\">\n",
" <div style=\"text-align: left\">\n",
" <h1>Lösungen Tutorial 2</h1>\n",
" </div>\n",
" <img style=\"float: right; margin: 0px 15px 15px 0px\" src=\"https://preview.redd.it/44aw5j979ve61.png?auto=webp&s=a0285d3a6e42e88b15bd738bc483412bb3efb019\" width=\"300\" />\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "89c3ed2f-6f9b-4d5c-adeb-482b4fd83b2b",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"### Aufgabe \n",
"\n",
"*3 Punkte*\n",
"\n",
"Schreibe eine Funktion `sum_up` mit Eingabeparameter `n`, welcher die Zahlen von `1...n` aufsummiert.\n",
"\n",
"Nutze dafür einen `for-loop`.\n",
"\n",
"**Beispiel**:\n",
"\n",
"$$n = 5$$ \n",
"$$sum\\_up(5) \\rightarrow 1 \\rightarrow 1 + 2 = 3 \\rightarrow 3 + 3 = 6 \\rightarrow 6 + 4 = 10 \\rightarrow 10 + 5 = 15$$\n",
"\n",
"Hinweis: die Funktion `range()` zählt standardmässig von `0...n-1`. Schauen Sie sich gerne dazu die offizielle Dokumentation an [PEP 204](https://peps.python.org/pep-0204/#list-ranges)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "d6de90ca-1db9-4c59-a5a4-42016370cb35",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"15"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def sum_up(n: int) -> int:\n",
" count = 0\n",
" for i in range(1,n+1):\n",
" count += i\n",
" return count\n",
"\n",
"sum_up(5)"
]
},
{
"cell_type": "markdown",
"id": "7a9de268-09e4-45e5-8aa9-db5ae79e9540",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"source": [
"Es gibt immer einen besseren weg.\n",
"\n",
"Nach Gauß:\n",
"\n",
"$$\\sum_{k=1}^n k = 1 + 2 + 3 + \\dots + n = \\frac{n(n+1)}{2}$$"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "fd8eea02-c356-4906-8db8-ae4cdaf4f97c",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"15"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# nach Gauß\n",
"def sum_up(n: int) -> int:\n",
" return int(n*(n+1)/2)\n",
"\n",
"sum_up(5)"
]
},
{
"cell_type": "markdown",
"id": "ea73e1ec-7b2a-4293-b269-03b8054aaa54",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"### Aufgabe\n",
"\n",
"*2 Punkte*\n",
"\n",
"Ihnen ist das Dictionary `dict2` gegeben. Ändern Sie jeden Wert in dem Dictionary nach der Formel $f(x) = x^3-1$ mittels `for-loop`.\n",
"\n",
"Tipp: Lassen Sie sich nicht von den Schlüsseln verwirren."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "2a3e9cac-49ee-49f0-88da-a75e9611f1d8",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"{'a': 56, 5: 12, 'python': 9, 3.14: 1.141414}"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Vorgegeben\n",
"dict2 = {\"a\": 56, 5: 12, \"python\": 9, 3.14: 1.141414}\n",
"dict2"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "26aa9f7b-b5e8-4f8f-a0d0-b796b253ad71",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"{'a': 175615, 5: 1727, 'python': 728, 3.14: 0.48706374396146557}"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Kurze Lösung mittels Dictionary Comprehension\n",
"dict2 = {key: value**3-1 for key, value in dict2.items()}\n",
"dict2"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4f625aaf-a04b-4c08-b18b-915b61c0145c",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"{'a': 175615, 5: 1727, 'python': 728, 3.14: 0.48706374396146557}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Lange Übersichtliche Lösung\n",
"for key, value in dict2.items():\n",
" dict2[key] = dict2[key]**3 - 1\n",
"dict2"
]
},
{
"cell_type": "markdown",
"id": "c4a7b4a9-7cbd-4127-8832-fdd7c3541409",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"### Zusatzaufgabe \n",
"\n",
"*Keine Punkte*\n",
"\n",
"Erstellen Sie eine List mittels List Comprehension, welche die Zahlen `1...6` auf deren kubische Zahl `1...216` also der Funktion $f(x) = x^3$ abbildet."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "f8e84221-f7da-474a-aa14-bcf7d1d3a201",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"[1, 8, 27, 64, 125, 216]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cubics = [n**3 for n in range(1,7)]\n",
"cubics"
]
},
{
"cell_type": "markdown",
"id": "3cdbb5b7-f828-48eb-ba49-09d5ae68c2d7",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"### Aufgabe\n",
"\n",
"*2 Punkte*\n",
"\n",
"Erstellen und Öffnen sie eine Datei `testfile.txt` mit der `open` Funktion, nutzen Sie dafür das `with`-Statement.\n",
"\n",
"Schreiben Sie in diese Datei 100 mal den String `\"Python\\n\"`."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "90875b44-8209-498a-ad38-063772588711",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [],
"source": [
"with open('testfile.txt', 'w') as f:\n",
" for _ in range(100):\n",
" f.write(\"Python\\n\")"
]
},
{
"cell_type": "markdown",
"id": "c69ac8e9-34ef-413a-a39f-7db6a830cde3",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"### Aufgabe\n",
"\n",
"*2 Punkte*\n",
"\n",
"Öffnen Sie die zuvor erstellte Datei `testfile.txt` im Lesemodus und weißen Sie den Inhalt der `.readlines()` Funktion der Variabeln `lines` zu. "
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "a8395ec5-59dc-43e3-a59d-9dea7cf1f21d",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Anzahl der gelesenen Zeilen: 100\n"
]
}
],
"source": [
"lines = None # vorgegeben\n",
"with open('testfile.txt', 'r') as f:\n",
" lines = f.readlines()\n",
"\n",
"print(\"Anzahl der gelesenen Zeilen:\", len(lines))"
]
},
{
"cell_type": "markdown",
"id": "00561f0d-9d9f-45bd-bf1f-824f04edf795",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"### Aufgabe\n",
"\n",
"*3 Punkte*\n",
"\n",
"Importiere Python Built-In Library `random` und rufe zuerst aus dem Modul die Funktion `seed` auf mit dem Eingabewert `42`, und weiße danach der Variable `rand` den Wert des Funktionsaufrufes von `randint(1,100)` zu. "
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "63c44277-581a-426c-8e2d-ed911688ca91",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"82"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rand = None # vorgegeben\n",
"import random\n",
"random.seed(42)\n",
"rand = random.randint(1,100)\n",
"rand"
]
},
{
"cell_type": "markdown",
"id": "78ec5791-46b7-4693-b276-7f5e73a18eb7",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"### Aufgabe\n",
"\n",
"*1 Punkt*\n",
"\n",
"Importieren Sie die Built-In Library `datetime` als `dt`."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "e3f4fe99-5980-4c2a-be4e-ae777f4bbb3d",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2024-11-08 11:58:43.750641\n"
]
}
],
"source": [
"import datetime as dt\n",
"print(dt.datetime.now())"
]
},
{
"cell_type": "markdown",
"id": "d1bf6ca3-4f96-456e-a8e9-34d9fd081c5b",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"source": [
"### Aufgabe\n",
"\n",
"*2 Punkte*\n",
"\n",
"Importieren Sie die Funktion `sqrt` aus dem Built-In Modul `math`.\n",
"Berechnen Sie $\\sqrt4$. Speichern Sie das Ergebnis in der variablen `s4`."
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "eed3fc0f-67c1-43d5-ac2f-f6b7646aecdd",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"2.0"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from math import sqrt\n",
"s4 = sqrt(4)\n",
"s4"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

637
Material/V4.ipynb Normal file
View File

@ -0,0 +1,637 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "80fd796e-f42e-4940-89ae-e7359be4d10a",
"metadata": {},
"source": [
"# 4 Vorlesung"
]
},
{
"cell_type": "markdown",
"id": "cb2fcdfe-257a-4736-b9c2-5fa17d63fd1b",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## Generatoren\n",
"```python\n",
"def <funktion-name>(<parameterliste>):\n",
" # do something\n",
" yield <ergebnis>\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "0ea7c66c-439c-4a3b-a154-3449c2a799a1",
"metadata": {},
"source": [
"### Endliche Generatoren"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "d5465edd-a13d-4fa0-a805-30c35a384d54",
"metadata": {},
"outputs": [],
"source": [
"# Matrikelnummer generator\n",
"import random \n",
"def mat_nr_gen(anzahl: int) -> float:\n",
" for _ in range(anzahl):\n",
" yield random.randint(500_000, 700_000) # Generator weil yield"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "48109f19-47d2-45a1-bd03-9eccb4d25372",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<generator object mat_nr_gen at 0x10838f060>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sem_3 = mat_nr_gen(5) # generator erstellen\n",
"sem_3"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "413bbbf6-87c8-41ff-8680-a70e8456d865",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"559540"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"next(sem_3) # Nächsten Wert des Generators"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "14a1220d-ae0c-428b-bd51-564e66e55854",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"606586"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"next(sem_3) # ..."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "af75146c-e727-41e8-b496-695b93a68a56",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"503048\n",
"648312\n",
"629536\n",
"556597\n",
"512158\n"
]
}
],
"source": [
"for _ in range(5):\n",
" print(next(sem_3)) # 5 mal den generator aufrufen"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "4691aa5c-0e3d-4dff-93c1-835a805e20e9",
"metadata": {},
"outputs": [
{
"ename": "StopIteration",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[19], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msem_3\u001b[49m\u001b[43m)\u001b[49m\n",
"\u001b[0;31mStopIteration\u001b[0m: "
]
}
],
"source": [
"next(sem_3) # Generator hat keine Werte mehr -> Fehler"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "6790f776-4201-403f-b95d-d789a4fe3a6f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"591325\n",
"582340\n",
"622867\n",
"653166\n",
"531169\n",
"538806\n",
"571659\n"
]
}
],
"source": [
"for mat_nr in mat_nr_gen(7): # For loop übernimmt die komplette Arbeit\n",
" print(mat_nr)"
]
},
{
"cell_type": "markdown",
"id": "4cfbb732-c412-4ded-8f33-75a9917b0df1",
"metadata": {},
"source": [
"### Unendliche Generatoren"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "b2b3c678-a775-4213-9a73-4d3aa48eff5e",
"metadata": {},
"outputs": [],
"source": [
"# Seriennummer generator\n",
"def serial_nr_gen() -> int:\n",
" while True: # \"Führe unendlich of aus\"\n",
" yield random.randint(1000, 2000) # Generator weil yield"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "e6ba3c92-465c-487d-a936-a155ad713784",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1940\n",
"1748\n",
"1342\n",
"1463\n",
"1100\n",
"1748\n",
"1158\n",
"1577\n",
"1321\n",
"1949\n"
]
}
],
"source": [
"ser_gen = serial_nr_gen() # Generator erstellen\n",
"for _ in range(10):\n",
" print(next(ser_gen)) # 10 mal den generator abfragen"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "c015d2c3-238b-454a-b75e-f81a19f89a79",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1281"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"next(ser_gen) # Diesmal kein Fehler da Generator kein Ende hat"
]
},
{
"cell_type": "markdown",
"id": "cd8ed607-c0e0-481c-aaa7-cf07e8c97051",
"metadata": {},
"source": [
"## Type Hints"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "9f564549-70d7-4538-a3fd-7158514fa0d4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{2.0: 2.0, 'HI': 'HI', 9: 9, True: True}\n",
"0.0 <class 'float'>\n"
]
}
],
"source": [
"# Beispielfunktion\n",
"\n",
"# Type hints zeigen dem Programmierer welche Datentypen erwartet werden\n",
"def useless(p1: int, p2: float, p3: bool, p4: str) -> dict: \n",
" return {p1: p1, p2: p2, p3: p3, p4: p4}\n",
"\n",
"print(useless(2.0, \"HI\", 9, True)) # Aufruf mit \"Falschen\" Datentypen\n",
"\n",
"# Beispielvariablen:\n",
"zahl: int = 0.0 # Zahl ist ein Float\n",
"print(zahl, type(zahl))"
]
},
{
"cell_type": "markdown",
"id": "2572fb15-de4f-4be7-809b-955d26895d84",
"metadata": {},
"source": [
"## Dataclasses\n",
"\n",
"Auto Dataclass\n",
"\n",
"|Attribut|Wert|\n",
"|-|-|\n",
"|Marke|VW|\n",
"|Fahrzeugtyp|Limousine|\n",
"|Seriennummer|<Zufällig generiert>|"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "feb80166-b58a-46bf-94b0-f26142d6131f",
"metadata": {},
"outputs": [],
"source": [
"from dataclasses import dataclass"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "b9c6ba77-1d59-4058-b18c-601989d9b8db",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<function dataclasses.dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False)>"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataclass # Decorator"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "81e41f92-8ce6-40de-9319-629cb69c73e9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Auto(marke='VW', model='Limousine', serial_nr=1146)"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ser_gen = serial_nr_gen()\n",
"\n",
"# Diese Syntax einfach merken\n",
"@dataclass\n",
"class Auto:\n",
" marke: str # 1 Attribut\n",
" model: str # 2 Attribut\n",
" serial_nr: int = next(ser_gen) # 3 Attribut mit Standardwert\n",
"\n",
"Auto(\"VW\", \"Limousine\") # Erstellt eine Auto Dataclass "
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "f2e0e50e-f1f9-4ead-8530-0aeb40989581",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Auto(marke='Porsche', model='SUV', serial_nr=1146)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Auto(model=\"SUV\", marke=\"Porsche\") # Attribute können explizit definiert werden"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "e5cb5618-50a9-4e38-a0b4-7e3e5e4c2295",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Auto(marke='Porsche', model='SUV', serial_nr=5678)"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Auto(model=\"SUV\", serial_nr=5678, marke=\"Porsche\") # Standardwerte lassen sich überschreiben "
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "655cbee0-88c0-4f60-97c5-4ef475d59f0b",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "Auto.__init__() got an unexpected keyword argument 'reifenzahl'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[37], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mAuto\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mSUV\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mserial_nr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m5678\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmarke\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPorsche\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreifenzahl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m)\u001b[49m\n",
"\u001b[0;31mTypeError\u001b[0m: Auto.__init__() got an unexpected keyword argument 'reifenzahl'"
]
}
],
"source": [
"Auto(model=\"SUV\", serial_nr=5678, marke=\"Porsche\", reifenzahl=5) # Nicht bekanntes Attribut wirft Fehler"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "22c0625c-4e7d-46aa-a711-5cc2bb759427",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'marke': 'Porsche', 'model': 'SUV', 'serial_nr': 12766}"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Beispiel als Dict\n",
"vw = {\n",
" \"marke\": \"Porsche\",\n",
" \"model\": \"SUV\",\n",
" \"serial_nr\": 12766\n",
"}\n",
"\n",
"vw"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "77668ca0-719d-48b8-954f-b2f7becdb318",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'marke': 'Porsche', 'model': 'SUV', 'serial_nr': 12766, 'reifenzahl': 7}"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Dict wirft keinen Fehler\n",
"vw[\"reifenzahl\"] = 7\n",
"vw"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "deb76203-f99c-45d1-b1f6-8395dc22ccab",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Porsche'"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vw[\"marke\"] # Zugriff auf Wert im dict"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "b3397bbe-0925-4189-b079-bef46a3dff95",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Auto(marke='Porsche', model='SUV', serial_nr=5678)"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"porsche = Auto(model=\"SUV\", serial_nr=5678, marke=\"Porsche\")\n",
"porsche"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "4a244554-957a-423d-8561-765aad99475a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'SUV'"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"porsche.model # Zugriff auf Attribut in der Dataclass"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "3c02985e-e7b7-4dd6-aad5-02a3bd3e5312",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"5678"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"porsche.serial_nr # same"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "57ccfffc-e89b-4c51-bc6d-7bf2ca16720f",
"metadata": {},
"outputs": [
{
"ename": "KeyError",
"evalue": "'mark'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[44], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mvw\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmark\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n",
"\u001b[0;31mKeyError\u001b[0m: 'mark'"
]
}
],
"source": [
"vw[\"mark\"] # KeyError wenn schlüssel nicht vorhanden im dict"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "8e508117-c1b3-4bf1-b9ae-a73b7bafd801",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Auto(marke=True, model=2.14, serial_nr=1146)"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Type Hints sind Type Hints und hindern nicht daran \"Falsche\" Datentypen an die Dataclasss zu vergeben \n",
"Auto(model=2.14, marke=True) "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

100
Material/testfile.txt Normal file
View File

@ -0,0 +1,100 @@
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python
Python

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -48,7 +48,7 @@
"source": [ "source": [
"# Was ist NumPy\n", "# Was ist NumPy\n",
"\n", "\n",
"NumPy steht für *Numerical Python*, ist OpenSource und wird mittlerweile von nahezu jedem Python Entwickeler verwendet. Dabei ist das Core Feature von NumPy seine effiziente Implementierung eines n-dimensionales Arrays in C, welches in Python verwendet werden kann. Hinzu kommt eine Hülle an Funktionen wie effiziente Zufallsalgorithmen und mathematische Funktionen aus den unterschiedlichten Bereichen der Statistik und numerischen Berechnung, welche alle für NumPy Arrays Optimiert sind. Im folgenden wollen wir den Umgang mit NumPy Arrays lernen. \n", "NumPy steht für *Numerical Python*, ist OpenSource und wird mittlerweile von nahezu jedem Python Entwickeler verwendet. Dabei ist das Core Feature von NumPy seine effiziente Implementierung eines n-dimensionales Arrays in C, welches in Python verwendet werden kann. Hinzu kommt eine Hülle an Funktionen wie effiziente Zufallsalgorithmen und mathematische Funktionen aus den unterschiedlichten Bereichen der Statistik und numerischen Berechnung, welche alle für NumPy Arrays optimiert sind. Im Folgenden wollen wir den Umgang mit NumPy Arrays lernen. \n",
"\n", "\n",
"__Für dieses Notebook schauen Sie bitte in die [NumPy Docs](https://numpy.org/doc/stable/reference/index.html)!!!__ Dort sind alle Funktionen beschrieben die wir hier bearbeiten und noch mehr!\n", "__Für dieses Notebook schauen Sie bitte in die [NumPy Docs](https://numpy.org/doc/stable/reference/index.html)!!!__ Dort sind alle Funktionen beschrieben die wir hier bearbeiten und noch mehr!\n",
"\n", "\n",
@ -71,7 +71,7 @@
"source": [ "source": [
"# Was ist Matplotlib\n", "# Was ist Matplotlib\n",
"\n", "\n",
"Matplotlib ist eine Python Bibliothek zum (interaktiven) Visualisieren von Daten. Die Bibliothek intergiert sich super mit anderen viel Benutzten Python Bibliotheken wie NumPy. Der Vorteil in Kombination mit Jupyter besteht in der direkten Ausgabe eines Plots auf dem Bildschirm.\n", "Matplotlib ist eine Python Bibliothek zum (interaktiven) Visualisieren von Daten. Die Bibliothek integriert sich gut mit anderen viel benutzten Python Bibliotheken wie NumPy. Der Vorteil der Kombination mit Jupyter besteht in der direkten Ausgabe eines Plots auf dem Bildschirm.\n",
"\n", "\n",
"__Nutzen Sie für diese Aufgabe gerne die [Matplotlib Reference](https://matplotlib.org/stable/users/index.html)__\n", "__Nutzen Sie für diese Aufgabe gerne die [Matplotlib Reference](https://matplotlib.org/stable/users/index.html)__\n",
"\n", "\n",
@ -150,13 +150,13 @@
"source": [ "source": [
"# Was ist ein Array?\n", "# Was ist ein Array?\n",
"\n", "\n",
"Ein Array ist eine kontinuierliche Datenstrucktur. Dabei werden die Daten in Reihe im Arbeitsspeicher hinterlegt, vergleichbar mit der Python Liste.\n", "Ein Array ist eine kontinuierliche Datenstruktur. Dabei werden die Daten in Reihe im Arbeitsspeicher hinterlegt, vergleichbar mit der Python Liste.\n",
"\n", "\n",
"## Erstellen von Arrays\n", "## Erstellen von Arrays\n",
"\n", "\n",
"Alle folgenden Beispiele finden Sie im [Beginners Guide](https://numpy.org/doc/stable/user/absolute_beginners.html).\n", "Alle folgenden Beispiele finden Sie im [Beginners Guide](https://numpy.org/doc/stable/user/absolute_beginners.html).\n",
"\n", "\n",
"Für unser erstes Beispiel erstellen wir aus einer Python liste ein [NumPy Array](https://numpy.org/doc/stable/reference/arrays.html)." "Für unser erstes Beispiel erstellen wir aus einer Python Liste ein [NumPy Array](https://numpy.org/doc/stable/reference/arrays.html)."
] ]
}, },
{ {
@ -306,7 +306,7 @@
} }
}, },
"source": [ "source": [
"Diese Datenstrucktur wird Allgemein auch Matrix gennant. Der Zugriff auf ein Element einer Matrix folgt nach dem Prinzip \"Spalte->Reihe\". Die erste Spalte ist demnach:" "Diese Datenstruktur wird Allgemein auch Matrix gennant. Der Zugriff auf ein Element einer Matrix folgt nach dem Prinzip \"Spalte->Reihe\". Die erste Spalte ist demnach:"
] ]
}, },
{ {
@ -353,7 +353,7 @@
} }
}, },
"source": [ "source": [
"Der zugriff auf ein einzelnes element erfolgt dann analog:" "Der Zugriff auf ein einzelnes Element erfolgt dann Analog:"
] ]
}, },
{ {
@ -400,7 +400,7 @@
} }
}, },
"source": [ "source": [
"Oder mit der NumPys eigener Syntax `arr[<spalte>, <reihe>]`" "Oder mit NumPys eigener Syntax `arr[<spalte>, <reihe>]`"
] ]
}, },
{ {
@ -449,12 +449,12 @@
"source": [ "source": [
"## Platzreservierung\n", "## Platzreservierung\n",
"\n", "\n",
"Falls bekannt ist wie viele Elemente ein Array im späteren Programmverlauf haben soll, bietet einem NumPy die möglichkeit diesen Platz im speicher gewissermaßen zu reservieren.\n", "Falls bekannt ist, wie viele Elemente ein Array im späteren Programmverlauf haben soll, bietet einem NumPy die Möglichkeit diesen Platz im Speicher gewissermaßen zu reservieren.\n",
"Hierfür gibt es einige Funktionen.\n", "Hierfür gibt es einige Funktionen.\n",
"\n", "\n",
"### Ones\n", "### Ones\n",
"\n", "\n",
"1 Dimensionales NumPy Array der größe 10 mit 1 gefüllt:" "1 Dimensionales NumPy Array der Größe 10 mit 1 gefüllt:"
] ]
}, },
{ {
@ -552,7 +552,7 @@
"source": [ "source": [
"### Empty\n", "### Empty\n",
"\n", "\n",
"Analog mit zufälligen Werten (bzw. Werte die bereits an der Speicherstelle waren, meistens 0):" "Analog mit zufälligen Werten (bzw. Werte, die bereits an der Speicherstelle waren, meistens 0):"
] ]
}, },
{ {
@ -812,7 +812,7 @@
"\n", "\n",
"*1 Punkt*\n", "*1 Punkt*\n",
"\n", "\n",
"Erstellen Sie ein NumPy Array mit 11 Elementen mittels `linspace`, Dabei soll der Startwert = -4 und der Endwert = 17 sein. Speichern Sie das Ergbniss in der Variablen `x_scale`. " "Erstellen Sie ein NumPy Array mit 11 Elementen mittels `linspace`. Dabei soll der Startwert = -4 und der Endwert = 17 sein. Speichern Sie das Ergbniss in der Variablen `x_scale`. "
] ]
}, },
{ {
@ -912,8 +912,8 @@
"Wie dem [Getting Started](https://matplotlib.org/stable/users/getting_started/index.html#getting-started) Beispiel zu entnehmen, wollen wir einmal die Sinus Funktion plotten.\n", "Wie dem [Getting Started](https://matplotlib.org/stable/users/getting_started/index.html#getting-started) Beispiel zu entnehmen, wollen wir einmal die Sinus Funktion plotten.\n",
"\n", "\n",
"Dazu brauchen wir zwei Attribute:\n", "Dazu brauchen wir zwei Attribute:\n",
"1. Die x-Skala - Dies kann die Länge eines Datensets sein, oder ein allegemeiner Linespace. Aufjedenfall eine Liste bzw. Array.\n", "1. Die x-Skala - Dies kann die Länge eines Datensets sein, oder ein allgemeiner Linespace. Auf jeden Fall eine Liste bzw. Array.\n",
"2. Die y-Skala - Im Allgemeinen die Werte eines zu plottenden Datensets. Aufjedenfall auch eine Liste bzw. Array.\n", "2. Die y-Skala - Im Allgemeinen die Werte eines zu plottenden Datensets. Auf jeden Fall auch eine Liste bzw. Array.\n",
"\n", "\n",
"Plotten wir im Folgenden die Sinus Funktion. Eine der schönen Eigenschaften der Sinus Funktion ist, dass diese sich nach dem Intervall $[0...2\\pi]$ wiederholt. Daher enthält die x-Skala einen linespace von $[0...2\\pi]$. Als Wert für $\\pi$ wird die NumPy Konstante [np.pi](https://numpy.org/doc/stable/reference/constants.html#numpy.pi) verwendet.\n", "Plotten wir im Folgenden die Sinus Funktion. Eine der schönen Eigenschaften der Sinus Funktion ist, dass diese sich nach dem Intervall $[0...2\\pi]$ wiederholt. Daher enthält die x-Skala einen linespace von $[0...2\\pi]$. Als Wert für $\\pi$ wird die NumPy Konstante [np.pi](https://numpy.org/doc/stable/reference/constants.html#numpy.pi) verwendet.\n",
"\n", "\n",
@ -1027,7 +1027,7 @@
"source": [ "source": [
"## Aufgabe - Erster eigener Plot Square Root\n", "## Aufgabe - Erster eigener Plot Square Root\n",
"\n", "\n",
"Analog zu voheriger Erklärung Plotten Sie im folgenden die Funktion Square Root Mathematisch definiert als $f(x) = \\sqrt x; \\quad x \\geq 0$.\n", "Analog zu voheriger Erklärung plotten Sie im folgenden die Funktion Square Root, Mathematisch definiert als $f(x) = \\sqrt x; \\quad x \\geq 0$.\n",
"\n", "\n",
"Gehen Sie dabei wie folgt vor:\n", "Gehen Sie dabei wie folgt vor:\n",
"1. Definieren Sie einen **geeigneten** [Linespace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) für die Zahlenraum 0...100. (Tipp: Achten Sie auf die Definition! Die Wurzel ist nur für positive Zahlen definiert.)\n", "1. Definieren Sie einen **geeigneten** [Linespace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) für die Zahlenraum 0...100. (Tipp: Achten Sie auf die Definition! Die Wurzel ist nur für positive Zahlen definiert.)\n",
@ -1087,9 +1087,9 @@
"source": [ "source": [
"# Styling\n", "# Styling\n",
"\n", "\n",
"Da bei mehreren Plots der Überblick schnell verloren geht beschäftigen wir uns im folgenden mit dem Styling. Dabei gehen wir im Schnelldurchlauf durch alle Parameter.\n", "Da bei mehreren Plots der Überblick schnell verloren geht, beschäftigen wir uns im folgenden mit dem Styling. Dabei gehen wir im Schnelldurchlauf durch alle Parameter.\n",
"\n", "\n",
"Die Grundlage für alle folgenden Plots werden in nächster Zelle gesetzt." "Die Grundlage für alle folgenden Plots werden in der nächsten Zelle gesetzt."
] ]
}, },
{ {
@ -1129,7 +1129,7 @@
"source": [ "source": [
"## Farbe ändern\n", "## Farbe ändern\n",
"\n", "\n",
"Die Standard Farbe für den ersten Plot ist immer Blau. Um die Farbe zu verändern wird `plt.plot` der Parameter `color` übergeben. Dieser erwartet einen String. Für eine genauere Erläuterung lesen Sie die Dokumentation zu [Specifying color](https://matplotlib.org/stable/users/explain/colors/colors.html). Für dieses Notebook werden die Beispiele mit den \"Single Character Shorthands\" (Aus der Dokumentation zu entnehmen) ausgestattet.\n", "Die Standard Farbe für den ersten Plot ist immer Blau. Um die Farbe zu verändern wird `plt.plot` der Parameter `color` übergeben. Dieser erwartet einen String. Für eine genauere Erläuterung, lesen Sie die Dokumentation zu [Specifying color](https://matplotlib.org/stable/users/explain/colors/colors.html). Für dieses Notebook werden die Beispiele mit den \"Single Character Shorthands\" (Aus der Dokumentation zu entnehmen) ausgestattet.\n",
"\n", "\n",
"Plotten wir den Sinus nun in Rot:" "Plotten wir den Sinus nun in Rot:"
] ]
@ -1181,7 +1181,7 @@
"source": [ "source": [
"## Titel für den Plot setzen\n", "## Titel für den Plot setzen\n",
"\n", "\n",
"Dafür wird [plt.title](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html) der Paramter wird als String übergeben:" "Dafür wird [plt.title](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html) der Paramter als String übergeben:"
] ]
}, },
{ {
@ -1232,7 +1232,7 @@
"source": [ "source": [
"## Legende und Labels\n", "## Legende und Labels\n",
"\n", "\n",
"Um eine Legende anzuzeigen muss vor `plt.show` die Funktion [plt.legend](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html) aufgerufen werden. Damit dies Wirkung zeigt braucht muss jeder Plot mit dem Parameter `label` (als String) ausgezeichnet werden. Plotten wir im Folgenden den Sinus und Kosinus mit entsprechenden Labels." "Um eine Legende anzuzeigen, muss vor `plt.show` die Funktion [plt.legend](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html) aufgerufen werden. Damit dies Wirkung zeigt, muss jeder Plot mit dem Parameter `label` (als String) ausgezeichnet werden. Plotten wir im Folgenden den Sinus und Kosinus mit entsprechenden Labels."
] ]
}, },
{ {
@ -1284,7 +1284,7 @@
"source": [ "source": [
"## Linestyle\n", "## Linestyle\n",
"\n", "\n",
"Die letze wichtige Eigenschaft ist das Setzen eines Linestyles. Dazu wird `plt.plot` der parameter `linestyle` als String übergeben. Entnehmen Sie die verschiednen Linestyles bitte der Dokumentation zu [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html).\n", "Die letze wichtige Eigenschaft ist das Setzen eines Linestyles. Dazu wird `plt.plot` der Parameter `linestyle` als String übergeben. Entnehmen Sie die verschiedenen Linestyles bitte der Dokumentation zu [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html).\n",
"\n", "\n",
"Sinus als `dashed` line:" "Sinus als `dashed` line:"
] ]
@ -1338,12 +1338,12 @@
"\n", "\n",
"*8 Punkte*\n", "*8 Punkte*\n",
"\n", "\n",
"In der nächsten Aufgabe wollen wir gleich zwei Funktionen Plotten. $f(x) = \\sqrt x; x \\geq 0$ und $g(x) = x^2$.\n", "In der nächsten Aufgabe wollen wir gleich zwei Funktionen plotten. $f(x) = \\sqrt x; x \\geq 0$ und $g(x) = x^2$.\n",
"\n", "\n",
"Gehen Sie dabei wie folgt vor:\n", "Gehen Sie dabei wie folgt vor:\n",
"1. Definieren Sie einen geeigneten [Linespace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) für die Zahlenraum 0...3. (Tipp: Achten Sie auf die Definition! Die Wurzel ist nur für positive Zahlen definiert.)\n", "1. Definieren Sie einen geeigneten [Linespace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) für die Zahlenraum 0...3. (Tipp: Achten Sie auf die Definition! Die Wurzel ist nur für positive Zahlen definiert.)\n",
"2. Berechnen Sie mittels der Funktion [np.sqrt](https://numpy.org/doc/stable/reference/generated/numpy.sqrt.html#numpy.sqrt) die Werte für die Wurzel.\n", "2. Berechnen Sie mittels der Funktion [np.sqrt](https://numpy.org/doc/stable/reference/generated/numpy.sqrt.html#numpy.sqrt) die Werte für die Wurzel.\n",
"3. Berechnen Sie mittels der Funktion [np.square](https://numpy.org/doc/stable/reference/generated/numpy.square.html#numpy-square) die Werte für die Quadrat Zahlen\n", "3. Berechnen Sie mittels der Funktion [np.square](https://numpy.org/doc/stable/reference/generated/numpy.square.html#numpy-square) die Werte für die Quadratzahlen\n",
"4. Geben Sie den beiden Plots die Farben Grün & Rot. Nutzen Sie gerne die [Color Shorthands](https://matplotlib.org/stable/users/explain/colors/colors.html) aus der Dokumentation.\n", "4. Geben Sie den beiden Plots die Farben Grün & Rot. Nutzen Sie gerne die [Color Shorthands](https://matplotlib.org/stable/users/explain/colors/colors.html) aus der Dokumentation.\n",
"5. Plotten Sie die Square Funktion mit dem Linestyle `dashdot`, wie der Dokumentation zu entnehmen [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html)\n", "5. Plotten Sie die Square Funktion mit dem Linestyle `dashdot`, wie der Dokumentation zu entnehmen [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html)\n",
"6. Geben Sie den beiden Plots angemessene Labels.\n", "6. Geben Sie den beiden Plots angemessene Labels.\n",
@ -1424,7 +1424,7 @@
"source": [ "source": [
"# Warum Zufall?\n", "# Warum Zufall?\n",
"\n", "\n",
"Für statistische Analysen jeglicher Art ist es wichtig seine Werkzeuge zu verstehen. Da nicht immer direkt ein Dataset vorliegt oder dieses zurzeit noch im Erstellungsprozess ist, gibt es die Möglichkeit die mathematischen und programmatischen Werzeuge zuvor an nachvollziebaren Zufallsdaten zu testen. Dabei wollen wir in dieser Übung lernen, was Zufall ist, wie Zufallsgeneratoren funktionieren und wie der Zufall auf bestimmte Art manipuliert werden kann.\n", "Für statistische Analysen jeglicher Art ist es wichtig seine Werkzeuge zu verstehen. Da nicht immer direkt ein Dataset vorliegt, oder dieses zurzeit noch im Erstellungsprozess ist, gibt es die Möglichkeit, die mathematischen und programmatischen Werzeuge zuvor an nachvollziebaren Zufallsdaten zu testen. Dabei wollen wir in dieser Übung lernen, was Zufall ist, wie Zufallsgeneratoren funktionieren und wie der Zufall auf bestimmte Art manipuliert werden kann.\n",
"\n", "\n",
"---" "---"
] ]
@ -1478,11 +1478,11 @@
"\n", "\n",
"Wenn $ c = 0 $ dann nennt man den Generator auch _Multiplicative Congruent Generator (MCG)_.\n", "Wenn $ c = 0 $ dann nennt man den Generator auch _Multiplicative Congruent Generator (MCG)_.\n",
"\n", "\n",
"Die Werte haben folgenden nutzen in der Funktion:\n", "Die Werte haben folgenden Nutzen in der Funktion:\n",
"\n", "\n",
"- $X_n$ ist der Startwert oder seed\n", "- $X_n$ ist der Startwert oder seed\n",
"- $X_{n+1}$ ist der folgewert der im nächsten schritt für $X_n$ eingesetzt wird\n", "- $X_{n+1}$ ist der Folgewert der im nächsten Schritt für $X_n$ eingesetzt wird\n",
"- $a$ ist der Vorfaktor vom Startwert dieser wird skaliert, deshalb wird er skalar gennant\n", "- $a$ ist der Vorfaktor vom Startwert. Dieser wird skaliert, deshalb wird er Skalar gennant\n",
"- $c$ ist das hinzuaddierte Offset\n", "- $c$ ist das hinzuaddierte Offset\n",
"- $m$ ist der Restklassenring oder auch Modulus genannt" "- $m$ ist der Restklassenring oder auch Modulus genannt"
] ]
@ -1508,7 +1508,7 @@
"Schreibe einen _Linear Congruent Generator_ mit dem funktionsnamen `lcg`.\n", "Schreibe einen _Linear Congruent Generator_ mit dem funktionsnamen `lcg`.\n",
"\n", "\n",
"- Nutze die oben gegebene Definition\n", "- Nutze die oben gegebene Definition\n",
"- Checke auch das Werte nicht verwendet werden dürfen (Bsp. $n \\geq 0$)\n", "- Prüfe auch, das Werte nicht verwendet werden dürfen (Bsp. $n \\geq 0$)\n",
"- `lcg` muss ein unendlicher Generator sein" "- `lcg` muss ein unendlicher Generator sein"
] ]
}, },
@ -1666,9 +1666,9 @@
" </figure>\n", " </figure>\n",
" <div style=\"margin-left: 40px; max-width: 60%; word-wrap:break-word;\">\n", " <div style=\"margin-left: 40px; max-width: 60%; word-wrap:break-word;\">\n",
" <br/>\n", " <br/>\n",
" <p><i>Linear Congruent Generators</i> zeichnen sich durch ihre Stabilität und Geschwindigkeit als Hervorragende Zufallsgeneratoren. Doch 2014 gelang Melissa E. O'Neil ein neuer durchbruch in der Konzeption von Pseudozufallsgeneratoren. Das Problem mit existierenden Zufallsgeneratoren ist entweder ihre Stabilität (Wie vorhersehbar die Zufallszahlen sind) oder ihrer Geschwindigkeit (Wie lange der Zufallsgenerator braucht um die nächste Zufallszahl zu errechnen).</p>\n", " <p><i>Linear Congruent Generators</i> zeichnen sich durch ihre Stabilität und Geschwindigkeit als Hervorragende Zufallsgeneratoren. Doch 2014 gelang Melissa E. O'Neil ein neuer Durchbruch in der Konzeption von Pseudozufallsgeneratoren. Das Problem mit existierenden Zufallsgeneratoren ist entweder ihre Stabilität (Wie vorhersehbar die Zufallszahlen sind) oder ihre Geschwindigkeit (Wie lange der Zufallsgenerator braucht um die nächste Zufallszahl zu errechnen).</p>\n",
" <p>Ihr Durchbruch gelang indem Sie die Vorteile eines <i>Linear Congruent Generators</i> mit dem eines <i>XorShift Generators</i> verband. Dadurch erreichte Sie nicht nur eine Normalverteilung in den generierten Zufallszahlen (und eine damit einhergende Stabilität), Sie hatte auch eine Family von schnellen einfachen Algorithmen entwickeln. Diese nennen sich <i>PCG - Permuted Congruential Generator</i>.</p>\n", " <p>Ihr Durchbruch gelang, indem Sie die Vorteile eines <i>Linear Congruent Generators</i> mit dem eines <i>XorShift Generators</i> verband. Dadurch erreichte Sie nicht nur eine Normalverteilung in den generierten Zufallszahlen (und eine damit einhergende Stabilität), Sie hatte auch eine Family von schnellen einfachen Algorithmen entwickelt. Diese nennen sich <i>PCG - Permuted Congruential Generator</i>.</p>\n",
" <p>Die Implementierungsdetails lassen wir im nächsten Schritt aus, da diese sich nicht einfach in Python umzusetzen sind. Auf der Webseite <a href=\"https://www.pcg-random.org\" >pcg-random.org</a> lassen sich implemtierungen für C & C++ finden. Als weiterführende Literatur ist <a href=\"https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf\" >PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation - Melissa E. ONeill</a> als Literatur angegeben.</p>\n", " <p>Die Implementierungsdetails lassen wir im nächsten Schritt aus, da diese nicht einfach in Python umzusetzen sind. Auf der Webseite <a href=\"https://www.pcg-random.org\" >pcg-random.org</a> lassen sich Implemtierungen für C & C++ finden. Als weiterführende Literatur ist <a href=\"https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf\" >PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation - Melissa E. ONeill</a> als Literatur angegeben.</p>\n",
" </div>\n", " </div>\n",
"</div>\n", "</div>\n",
"\n", "\n",
@ -1697,8 +1697,8 @@
"\n", "\n",
"- Gegeben ist der Anfangszustand des Generators.\n", "- Gegeben ist der Anfangszustand des Generators.\n",
"- Nutze die Dokumentation und rufe den `default_rng` aus dem `numpy.random` Modul, **20** mal auf speichere die Werte in der variablen `pcgs`. *(Tipp: Nutze ein NumPy Array)*\n", "- Nutze die Dokumentation und rufe den `default_rng` aus dem `numpy.random` Modul, **20** mal auf speichere die Werte in der variablen `pcgs`. *(Tipp: Nutze ein NumPy Array)*\n",
"- Sortiere im nächsten Schritt die in `pcgs` gespeicherten Werte und speicher diese in `pcgs_sorted`\n", "- Sortiere im nächsten Schritt die in `pcgs` gespeicherten Werte und speichere diese in `pcgs_sorted`\n",
"- Plotte sinnvoll beide Array, gestalte den Plott angemessen." "- Plotte sinnvoll beide Array. Gestalte den Plot angemessen."
] ]
}, },
{ {
@ -1816,7 +1816,7 @@
"\n", "\n",
"# Plot Types\n", "# Plot Types\n",
"\n", "\n",
"Im folgenden Kapitel beschäftigen wir uns mit verschiedensten Plot typen." "Im folgenden Kapitel beschäftigen wir uns mit verschiedensten Plot Typen."
] ]
}, },
{ {
@ -1890,9 +1890,9 @@
"source": [ "source": [
"## Bar Charts\n", "## Bar Charts\n",
"\n", "\n",
"Beliebt sind Barcharts. Dazu werden aber mehrere Parameter benötigt. Da einfache mathematische Funktionen bei dieser Art Plot keinen Sinn ergeben.\n", "Beliebt sind Barcharts. Dazu werden aber mehrere Parameter benötigt, da einfache mathematische Funktionen bei dieser Art Plot keinen Sinn ergeben.\n",
"\n", "\n",
"Konsultieren wir dafür folgendes Beispiel.\n", "Konsultieren wir dafür folgendes Beispiel:\n",
"\n", "\n",
"Wir wollen wissen wie viele Kinder an einer Grundschule in jeder Klassenstufe sind.\n", "Wir wollen wissen wie viele Kinder an einer Grundschule in jeder Klassenstufe sind.\n",
"Dazu benötigen wir 2 Listen.\n", "Dazu benötigen wir 2 Listen.\n",
@ -1984,7 +1984,7 @@
"source": [ "source": [
"### Bessere Datenrepresentation\n", "### Bessere Datenrepresentation\n",
"\n", "\n",
"Da die Daten aus `classes` & `kids` miteinander eine Verbindung teilen wäre die Repräsentation mittels Dictionary die klügere Wahl um keine Fehler in den Plot zu bringen.\n", "Da die Daten aus `classes` & `kids` miteinander eine Verbindung teilen wäre, die Repräsentation mittels Dictionary die klügere Wahl, um keine Fehler in den Plot zu bringen.\n",
"\n", "\n",
"Mittels der `.keys` & `.values` Funktion auf dem Dictionary lassen sich dann die Daten gezielt plotten.\n", "Mittels der `.keys` & `.values` Funktion auf dem Dictionary lassen sich dann die Daten gezielt plotten.\n",
"\n", "\n",
@ -2167,7 +2167,7 @@
"source": [ "source": [
"### X-Label\n", "### X-Label\n",
"\n", "\n",
"Analog Dazu die Beschriftung der X-Achse mit `plt.xlabel`." "Analog dazu die Beschriftung der X-Achse mit `plt.xlabel`."
] ]
}, },
{ {
@ -2508,7 +2508,7 @@
} }
}, },
"source": [ "source": [
"Zum setzen von Prozentwerten wird der Parameter `autopct` verwendet. Dieser nutzt einen Format String oder eine Funktion zum definieren der Werte. Schaue dazu für mehr in die Dokumentation für [autpct](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html#matplotlib-pyplot-pie), eine Dokumentation zu Formatstrings findest du [hier](https://www.geeksforgeeks.org/format-specifiers-in-c/).\n", "Zum Setzen von Prozentwerten wird der Parameter `autopct` verwendet. Dieser nutzt einen Format String oder eine Funktion zum Definieren der Werte. Schaue dazu für mehr in die Dokumentation für [autpct](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html#matplotlib-pyplot-pie), eine Dokumentation zu Formatstrings findest du [hier](https://www.geeksforgeeks.org/format-specifiers-in-c/).\n",
"\n", "\n",
"Beispiel für Prozentwerte:" "Beispiel für Prozentwerte:"
] ]
@ -2626,7 +2626,7 @@
} }
}, },
"source": [ "source": [
"Zum herausnehmen von Kuchenstücken gibt es den Parameter `explode` dieser erwartet eine Liste mit Fließkommezahlen die zwischen 0.0 - Standardwert und 1.0 - absoluter Explode liegen.\n", "Zum Herausnehmen von Kuchenstücken gibt es den Parameter `explode`. Dieser erwartet eine Liste mit Fließkommazahlen die zwischen 0.0 - Standardwert und 1.0 - absoluter Explode liegen.\n",
"\n", "\n",
"Beispiel Klasse 3 ist vom Ursprung 20% entfernt:" "Beispiel Klasse 3 ist vom Ursprung 20% entfernt:"
] ]
@ -2784,7 +2784,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.12.7" "version": "3.12.5"
} }
}, },
"nbformat": 4, "nbformat": 4,